home *** CD-ROM | disk | FTP | other *** search
/ DS-CD ROM 2 1993 August / DS CD-ROM 2.Ausgabe (August 1993).iso / programm / ds0318a / lhafor1.exe / HANDBUCH.TXT < prev    next >
Text File  |  1992-11-18  |  509KB  |  7,312 lines

  1.  
  2.  
  3.        ╔══════════════════════════════════════════════════════════════════════╗
  4.        ║    Bibliothek FORSUB / FORSUBA / FORSUB7 für Microsoft-FORTRAN-77    ║
  5.        ║                                                                      ║
  6.        ║                             Version 8/92                             ║
  7.        ║                                                                      ║
  8.        ╟──────────────────────────────────────────────────────────────────────╢
  9.        ║                                                                      ║
  10.        ║ Inhaltsverzeichnis                                                   ║
  11.        ╟──────────────────────────────────────────────────────────────────────╢
  12.        ║                                                                      ║
  13.        ║ Allgemeine Informationen zur Bibliothek     .  .  .  .  .  Seite   1 ║
  14.        ║                                                                      ║
  15.        ║ Zeilenweise Ein- und Ausgabe am Bildschirm  .  .  .  .  .  Seite   5 ║
  16.        ║                                                                      ║
  17.        ║ Blockweise Ein- und Ausgabe am Bildschirm   .  .  .  .  .  Seite  30 ║
  18.        ║                                                                      ║
  19.        ║ Menüsteuerung .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  Seite  35 ║
  20.        ║                                                                      ║
  21.        ║ Bildschirmmasken .  .  .  .  .  .  .  .  .  .  .  .  .  .  Seite  45 ║
  22.        ║                                                                      ║
  23.        ║ Fenstertechnik   .  .  .  .  .  .  .  .  .  .  .  .  .  .  Seite  52 ║
  24.        ║                                                                      ║
  25.        ║ Schriftengeneratoren   .  .  .  .  .  .  .  .  .  .  .  .  Seite  89 ║
  26.        ║                                                                      ║
  27.        ║ Zeit- und Akustiksteuerung   .  .  .  .  .  .  .  .  .  .  Seite  94 ║
  28.        ║                                                                      ║
  29.        ║ Transformationen .  .  .  .  .  .  .  .  .  .  .  .  .  .  Seite  98 ║
  30.        ║                                                                      ║
  31.        ║ Zufallszahlen und Sortierungen  .  .  .  .  .  .  .  .  .  Seite 106 ║
  32.        ║                                                                      ║
  33.        ║ Stringmanipulationen   .  .  .  .  .  .  .  .  .  .  .  .  Seite 112 ║
  34.        ║                                                                      ║
  35.        ║ Laufwerks-, Verzeichnis- und Dateimanipulationen  .  .  .  Seite 129 ║
  36.        ║                                                                      ║
  37.        ║ Zugriff auf Speicherinhalte  .  .  .  .  .  .  .  .  .  .  Seite 144 ║
  38.        ║                                                                      ║
  39.        ║ Virituelle Speicherverwaltung   .  .  .  .  .  .  .  .  .  Seite 150 ║
  40.        ║                                                                      ║
  41.        ║ Childprozess und Interruptaufruf   .  .  .  .  .  .  .  .  Seite 158 ║
  42.        ║                                                                      ║
  43.        ║ Verschiedene Routinen  .  .  .  .  .  .  .  .  .  .  .  .  Seite 163 ║
  44.        ║                                                                      ║
  45.        ║ ASCII-Code-Tabelle  .  .  .  .  .  .  .  .  .  .  .  .  .  Seite 181 ║
  46.        ║                                                                      ║
  47.        ║ Farbcode-Tabelle .  .  .  .  .  .  .  .  .  .  .  .  .  .  Seite 182 ║
  48.        ║                                                                      ║
  49.        ║                                                                      ║
  50.        ║                                                                      ║
  51.        ║                                                                      ║
  52.        ║                                                                      ║
  53.        ║                                                                      ║
  54.        ║                                                                      ║
  55.        ║                                                                      ║
  56.        ║                                                                      ║
  57.        ╚══════════════════════════════════════════════════════════════════════╝
  58.     
  59.  
  60.                                                                        Seite 1
  61.  
  62.  
  63.                     BIBLIOTHEK FORSUB.LIB FÜR MICROSOFT-FORTRAN-77
  64.  
  65.  
  66.        Copyright
  67.  
  68.        (c) Copyright 1991/92 Fa. C. Killet Software, Postfach 400258, 4152
  69.        Kempen. Die hier beschriebene Software ist urheberrechtlich geschützt.
  70.        Sie darf ohne Zustimmung der Fa. C. Killet nicht verändert, verkauft
  71.        oder weitergegeben werden.  Als Sharewareversion gekennzeichnete
  72.        Produkte dürfen ausdrücklich uneingeschränkt kostenlos weitergegeben
  73.        werden. Der in dieser Dokumentation verwendete Begriff MICROSOFT ist ein
  74.        eingetragenes Warenzeichen der Microsoft Cooperation.
  75.  
  76.  
  77.        Haftung und Garantie
  78.  
  79.        Die Fa. C. Killet übernimmt die Garantie für die Lesbarkeit des direkt
  80.        bei ihr erworbenen Datenträgers und für die Verwendbarkeit der bei ihr
  81.        erworbenen Software in Höhe des Kaufpreises.  Darüber hinaus gibt die
  82.        Fa. C. Killet keine Garantien irgendeiner Art.  Unter keinen Umständen
  83.        ist die Fa. C. Killet haftbar für jedwede Folgeschäden, Verluste und
  84.        entgangene Gewinne, die durch den Gebrauch oder die Nichtverwendbarkeit
  85.        der Software entstehen.  Die Kopier- und Versandgebühr für Shareware-
  86.        produkte gilt dabei nicht als Kaufpreis.
  87.  
  88.  
  89.        Unterschied der Sharewareversion zur Originalbibliothek
  90.  
  91.        Bitte beachten Sie diesen Abschnitt nur, wenn Sie die Sharewareversion
  92.        erworben haben. Die Sharewarebibliothek entspricht den Bestimmungen der
  93.        "Association of Shareware Professionals" (ASP). In Übereinstimmung mit
  94.        den ASP-Richtlinien ist sie in keiner Weise eingeschränkt. Nach dem
  95.        Aufruf eines mit der Sharewarebibliothek gelinkten Programms wird in
  96.        bestimmten Zeitabständen ein Hinweisbildschirm ausgegeben. Der
  97.        Hinweisbildschirm hat keinen Einfluß auf das Programm. Nach dem
  98.        Ausblenden des Hinweises wird der ursprüngliche Bildschirminhalt
  99.        wiederhergestellt. In der Sharewareversion steht die Bibliothek in der
  100.        Emulator- und der 8087-Version des "Large"-Memory-Model zur Verfügung.
  101.        In der Originalversion kann zusätzlich die AltMath-Version erworben
  102.        werden. Die Ausführungsgeschwindigkeit damit gelinkter Programme ist
  103.        etwas geringer, der von den exekutiven Programmen benötigte
  104.        Speicherplatz ist etwas höher als bei mit der Originalversion gelinkten
  105.        Programmen. Sollte die Bibliothek Ihren Anforderungen entsprechen, so
  106.        benutzen Sie das Registrierungsformular aus der Datei "BESTELL.TXT" für
  107.        die Registrierung. Aus dem Hinweisbildschirm des Programms "ZEISATZ"
  108.        kann das Formular gedruckt werden. Registrierte Anwender erhalten ein
  109.        gedrucktes Benutzerhandbuch und die Originalsoftware mit einer
  110.        absetzbaren Rechnung. Mit Hilfe der Sharewareversion erstellte
  111.        Programme sind nach dem Linken mit der Originalbibliothek voll
  112.        gebrauchsfähig. Es müssen keine Änderungen in den Quelltexten
  113.        vorgenommen werden!
  114.  
  115.  
  116.     
  117.  
  118.                                                                        Seite 2
  119.  
  120.  
  121.        UPDATE-Service
  122.  
  123.        Registrierte Anwender können gegen eine Gebühr von DM 20.- jederzeit
  124.        die neuste Version der Bibliothek bei der Fa. C. Killet bestellen.
  125.        UPDATES bleiben zu der bisher benutzten Version voll kompatibel. Die
  126.        Bibliothek wird jedoch ständig mit neuen Routinen ergänzt und
  127.        verbessert.
  128.  
  129.  
  130.        Demonstrations-Programm
  131.  
  132.        Viele Subroutinen der Bibliothek werden in einem Demonstrations-Programm
  133.        vorgestellt.  Der Quelltext des Demonstrations-Programms ist in der
  134.        Datei "DEMO.FOR" zu finden.  Er enthält die beispielhafte Programmierung
  135.        vieler Subroutinen als Hilfe bei der Programmentwicklung. Das
  136.        compilierte und mit "FORSUB.LIB" gelinkte Programm steht in der
  137.        Datei "DEMO.EXE" zur Verfügung. Beim testweisen Linken des Programms ist
  138.        zu beachten, daß die Option /SE:256 verwendet wird. Bitte benutzen Sie
  139.        die folgende Syntax:
  140.        FL /FPi /AL /c DEMO.FOR
  141.        LINK DEMO,DEMO,NUL,LLIBFORE FORSUB,NUL /NOD /SE:256
  142.  
  143.  
  144.        Einsatz der Bibliothek
  145.  
  146.        Die Bibliothek FORSUB.LIB enthält ca. 180 Subroutinen zum Einsatz mit
  147.        dem MICROSOFT-FORTRAN-Compiler ab der Version 4.0. Die Bibliothek ist
  148.        in Versionen lieferbar, die zusammen mit den zu MICROSOFT-FORTRAN-77
  149.        gehörenden Standardlibraries LLIBFORE.LIB, LLIBFORA.LIB oder
  150.        LLIBFOR7.LIB verwendet werden können. Dabei wird das "Large"-Menory-
  151.        Model wahlweise in der Emulator, Altmath oder 8087-Version unterstützt.
  152.        Alle Subroutinen in FORSUB.LIB sind bezüglich ihres Laufzeitverhaltens
  153.        optimiert. Die Subroutinen der Library können mit MICROSOFT-FORTRAN
  154.        Objektmodulen und Objektmodulen aus anderen MICROSOFT-Compilern
  155.        zusammengelinkt werden. FORSUB.LIB funktioniert auf allen
  156.        IBM-compatiblen XT- und AT-Personal-Computern mit dem Betriebssystem
  157.        MS-DOS oder PC-DOS. Die Bibliothek ist auch mit anderen,
  158.        MICROSOFT-kompatiblen Compilern lauffähig.
  159.  
  160.  
  161.        Geschwindigkeit und Speicherbedarf
  162.  
  163.        FORSUB.LIB erweitert die Möglichkeiten der Programiersprache FORTRAN-77
  164.        erheblich, da als Ergänzung zur Standardbibliothek eine große Anzahl von
  165.        nicht-FORTRAN-spezifischen Funktionen zur Verfügung gestellt werden.
  166.        Ein Teil der in der Bibliothek enthaltenen Subroutinen sind in ASSEMBLER
  167.        programmiert. Das führt zu der hohen Geschwindigkeit und zum geringen
  168.        Speicherbedarf der in FORSUB.LIB enthaltenen Subroutinen.
  169.  
  170.  
  171.     
  172.  
  173.                                                                        Seite 3
  174.  
  175.  
  176.        Inhalt der Bibliothek
  177.  
  178.        Neben der zeilenweisen und blockweisen positionierten Ein- und Ausgabe
  179.        aller gängigen Datentypen am Bildschirm werden ein- und mehrfache
  180.        Auswahlen durch Menütechnik und die Dateneingabe per Bildschirmmaske zur
  181.        Verfügung gestellt.  Besondere Aufmerksamkeit verdienen die zahlreichen
  182.        Subroutinen zur hirachischen Fenstertechnik mit deren Hilfe Menüs, Texte
  183.        und Datenfelder erzeugt, verwaltet und im Arbeitspeicher abgelegt werden
  184.        können.  Die Benutzung vorgegebener oder selbsterzeugter Schrifttypen
  185.        unterschiedlicher Größe ist genauso möglich, wie die Verwendung
  186.        übergroßer Blockschriften.  Weitere Komponenten der Bibliothek sind
  187.        Routinen zur Zeitsteuerung und Akustik, das Erzeugen von Zufallszahlen
  188.        und Sortierungen von Datenfeldern.  Daneben können Format- und
  189.        Attributtransformationen, zahlreiche Routinen für verschiedene
  190.        Stringmanipulationen und viele Datei-, Verzeichnis- und Laufwerks-
  191.        funktionen verwendet werden.  Wichtig ist auch die Möglichkeit, direkt
  192.        auf Maschinenadressen zu schreiben oder Daten aus Maschinenadressen
  193.        auszulesen.  Bereiche des Arbeitspeichers können zum Zweck der
  194.        Datenablage allokiert und verwaltet werden.  Der Aufruf eines
  195.        Subprogramms oder einer DOS-Aplikation ist mit Subroutinen aus der
  196.        Bibliothek FORSUB.LIB genauso möglich, wie ein Interruptaufruf aus einem
  197.        FORTRAN-Programm.  Außerdem wird die Steuerung einer MICROSOFT-
  198.        kompatiblen Maus von der Bibliothek unterstützt.  Neben den hier
  199.        beschriebenen Anwendungsbereichen gibt es noch viele Subroutinen für
  200.        verschiedene Anwendungen.
  201.  
  202.  
  203.        Farbige Bildschirm- Ein- und Ausgabe
  204.  
  205.        Wenn eine Farbgraphikkarte und ein Farbbildschirm vorhanden sind, können
  206.        Bildschirm- Ein- und Ausgaben durch die Verwendung von Farbattributen in
  207.        beliebigen Vorder- und Hintergrundfarben dargestellt werden.  Wenn durch
  208.        die Konfiguration des verwendeten Bildschirms und der Graphikarte nur
  209.        eine monochrome Darstellung möglich ist, wird dieser Umstand von den
  210.        Subroutinen aus FORSUB.LIB erkannt, und die Farbattribute werden
  211.        automatisch der monochromen Ausgabe angepasst.  Eine Liste aller
  212.        möglichen Farbattribute befindet sich im Anhang des Benutzerhandbuchs.
  213.  
  214.  
  215.        Aufbau des Handbuchs
  216.  
  217.        Die Subroutinen der FORTRAN-Bibliothek FORSUB.LIB sind im Handbuch nach
  218.        Sachgebietsgruppen geordnet zusammengestellt.  Zu jeder
  219.        Sachgebietsgruppe gibt es eine Zusammenstellung der zu ihr gehörenden
  220.        Subroutinen und eine globale Erläuterung zum Sachgebiet.  Zu jeder
  221.        Subroutine korrespondiert mit einem separaten Kennblatt.
  222.  
  223.  
  224.        Kennblatt zur Subroutine
  225.  
  226.        Zu jeder Subroutine gehört ein separates Kennblatt.  Im ersten Teil des
  227.        Kennblatts wird der Zweck der Subroutine und die beim Aufruf erfolgenden
  228.        Aktionen beschrieben.  Alle Besonderheiten der Subroutine werden hier
  229.        erläutert.  Darauf folgt eine Auflistung der benötigten Parameter mit
  230.        der genauen Typbeschreibung, einer Kurzerläuterung und eventuellen
  231.     
  232.  
  233.                                                                        Seite 4
  234.  
  235.  
  236.        Beschränkungen in der Reihenfolge der Übergabe.  Beschränkungen und
  237.        Größenangaben sind dabei in [ ] angegeben.  In der Subroutine verwendete
  238.        externe Routinen aus der Bibliothek FORSUB.LIB sind in der Rubrik
  239.        "Subroutinen" gesondert aufgeführt.  Zum Schluß wird die Verwendung der
  240.        jeweiligen Subroutine anhand eines oder mehrerer Programmierbeispiele
  241.        veranschaulicht.  Dabei handelt es sich nicht um vollständige Programme,
  242.        sondern um Programmausschnitte.  Die Verwendung vieler Subroutinen kann
  243.        zusätzlich im Quelltext des zur Bibliothek gehörenden Demonstrations-
  244.        programms "DEMO.FOR" nachgelesen werden.
  245.  
  246.  
  247.        Parameterübergabe
  248.  
  249.        In der Bibliothek FORSUB.LIB sind ausschließlich SUBROUTINES zu finden.
  250.        Auf die Auslegung einzelner Routinen als FUNCTIONS wurde absichtlich
  251.        verzichtet, da selten nur ein einzelnes Parameter an das rufende
  252.        Programm zurückgegeben wird.  Alle Parameter des Typs INTEGER, REAL und
  253.        LOGICAL werden im 4-Byte-Format übergeben.  Das entspricht den in
  254.        MICROSOFT-FORTRAN üblichen Formaten, die ohne explizite Größenangabe
  255.        benutzt werden können.  CHARACTERS benutzen das übliche 1-Byte-Format,
  256.        Character-Strings erhalten die mit "*(n)" definierte Größe.
  257.  
  258.  
  259.        Utillities
  260.  
  261.        Zur FORTRAN-Bibliothek FORSUB.LIB gehören drei Programme.  Mit dem
  262.        Programm DIRECT können Dateien, die mit einem Texteditor erzeugt worden
  263.        sind, direct organisiert werden.  Direct organisierte Dateien werden von
  264.        den Subroutinen MENTXT, MASTXT und TXTFEN benötigt.  Das Programm
  265.        benötigt beim Aufruf zwei Parameter.  Im ersten Parameter wird der Name
  266.        der zu organisierenden Datei übergeben, im zweiten Parameter steht die
  267.        benötigte Recordlänge in Byte.
  268.        Aufruf: DIRECT [Laufwerk:\Pfad\]Datei Recordlänge
  269.  
  270.        Mit Hilfe des Programms ZEISATZ kann ein User-Zeichensatz erzeugt oder
  271.        korrigiert werden.  User-Zeichensätze können mit der Subroutine SCRIPT
  272.        aktiviert werden.  Beim Aufruf des Programms ist als Parameter der Name
  273.        einer vorhandenen oder neu anzulegenden Datei erforderlich.  Alle
  274.        anderen erforderlichen Eingaben werden im Dialog erfragt.
  275.        Aufruf: ZEISATZ Datei
  276.  
  277.        Das Programm KEY schreibt die Tastaturcodes und -flags beim Betätigen
  278.        der Tastatur in dezimaler Schreibweise auf den Bildschirm.
  279.        Aufruf:   KEY
  280.        Beenden : Ctrl C
  281.  
  282.  
  283.        Tabellen
  284.  
  285.        Im Anhang des Benutzerhandbuchs sind eine ASCII-Codetabelle und eine
  286.        Farbcodetabelle enthalten.
  287.  
  288.  
  289.     
  290.  
  291.                                                                        Seite 5
  292.  
  293.  
  294.        Compilieren und Linken mit FORSUB.LIB
  295.  
  296.        Um Routinen aus der Bibliothek FORSUB.LIB in Programme einzubinden,
  297.        können die folgenden FL-Kommandos (siehe User's Guide des
  298.        MICROSOFT-FORTRAN-Compilers) eingegeben werden:
  299.  
  300.        Compilieren:   FL /c /AL /FPi myfile.for
  301.        Linken:        LINK myfile,myfile,NUL,LLIBFORE FORSUB,NUL /NOD
  302.        FORSUB.LIB ist die Tools-Library für das Large-Model in der
  303.        Emulatorversion.
  304.        LLIBFORE.LIB ist die zu zum FORTRAN-Compiler gehörende
  305.        Standardbibliothek für das Large-Model in der Emulatorversion.
  306.  
  307.        oder:
  308.        Compilieren:   FL /c /AL /FPa myfile.for
  309.        Linken:        LINK myfile,myfile,NUL,LLIBFORA FORSUBA,NUL /NOD
  310.        FORSUBA.LIB ist die Tools-Library für das Large-Model in der
  311.        Altmath-Version.
  312.        LLIBFORA.LIB ist die zu zum FORTRAN-Compiler gehörende
  313.        Standardbibliothek für das Large-Model in der Altmath-Version.
  314.  
  315.        oder:
  316.        Compilieren:   FL /c /AL /FPi87 myfile.for
  317.        Linken:        LINK myfile,myfile,NUL,LLIBFOR7 FORSUB7,NUL /NOD
  318.        FORSUB7.LIB ist die Tools-Library für das Large-Model in der
  319.        8087-Version.
  320.        LLIBFOR7.LIB ist die zu zum FORTRAN-Compiler gehörende
  321.        Standardbibliothek für das Large-Model in der 0887-Version.
  322.     
  323.  
  324.                                                                        Seite 6
  325.  
  326.  
  327.        Zeilenweise Ein- und Ausgabe am Bildschirm
  328.  
  329.        Unter zeilenweiser Ein- und Ausgabe am Bildschirm wird die Eingabe
  330.        einzelner oder mehrerer numerischer oder alphanumerischer Zeichen von
  331.        der Tastatur aus mit dem entsprechenden Echo am Bildschirm, sowie die
  332.        Ausgabe einzelner oder mehrerer numerischer oder alphanumerischer
  333.        Zeichen zum Bildschirm verstanden.  Selbstverständlich ist die
  334.        positionierte Darstellung am Bildschirm durch die Angabe der
  335.        Ausgabezeile und -spalte möglich.  Die Farbe des Hinter- und
  336.        Vordergrunds der Bildschirmausgabe kann mit Hilfe eines Farbattributs
  337.        ausgewählt werden.  Eine Liste mit allen möglichen Farbattributen
  338.        befindet sich im Anhang des Benutzerhandbuchs.  Das Beenden von
  339.        Leseroutinen mit Hilfe frei zu wählender Abschlußtasten ist ebenso
  340.        möglich, wie das Mitführen der relativen Cursorposition. Dadurch können
  341.        einfache Editoren und Bildschirmmasken programmiert werden.
  342.  
  343.  
  344.        Subroutinen zur zeilenweisen Ein- und Ausgabe am Bildschirm
  345.  
  346.        AREAD   a) String positioniert einlesen
  347.                b) String positioniert korrigieren; Zeichen werden überschrieben
  348.                   oder übernommen.
  349.                c) String positioniert korrigieren; Vorgabe wird beim Schreiben
  350.                   des ersten Zeichens gelöscht, sonst übernommen.
  351.        AREADP  a) String positioniert einlesen, Cursorposition bestimmen
  352.                b) String positioniert korrigieren; Zeichen werden überschrieben
  353.                   oder übernommen; Cursorposition bestimmen.
  354.                c) String positioniert korrigieren; Vorgabe wird beim Schreiben
  355.                   des ersten Zeichens gelöscht, sonst übernommen; Cursor-
  356.                   position bestimmen.
  357.        AREADZ  a) String gefiltert positioniert einlesen
  358.                b) String gefiltert positioniert korrigieren; Zeichen werden
  359.                   überschrieben oder übernommen.
  360.                c) String gefiltert positioniert korrigieren; Vorgabe wird beim
  361.                   Schreiben des ersten Zeichens gelöscht, sonst übernommen.
  362.        AREADM  a) String zentriert positioniert einlesen
  363.                b) String zentriert positioniert korrigieren; Zeichen werden
  364.                   überschrieben oder übernommen.
  365.                c) String zentriert positioniert korrigieren; Vorgabe wird beim
  366.                   Schreiben des ersten Zeichens gelöscht, sonst übernommen.
  367.        AWRI    a) String positioniert ausgeben
  368.        AWRIM   a) String zentriert positioniert ausgeben
  369.        IREAD   a) Integerwert positioniert einlesen
  370.                b) Integerwert positioniert korrigieren; Ziffern werden
  371.                   überschrieben oder übernommen.
  372.                c) Integerwert positioniert korrigieren; Vorgabe wird beim
  373.                   Schreiben der ersten Ziffer gelöscht, sonst übernommen.
  374.        IWRI    a) Integerwert positioniert mit führenden Nullen ausgeben
  375.        IWRIB   a) Integerwert positioniert mit führenden Blanks ausgeben
  376.        RREAD   a) Realwert positioniert einlesen
  377.                b) Real positioniert korrigieren; Ziffern werden überschrieben
  378.                   oder übernommen.
  379.                c) Real positioniert korrigieren; Vorgabe wird beim Schreiben
  380.                   der ersten Ziffer gelöscht, sonst übernommen.
  381.        RWRI    a) Realwert positioniert mit führenden Nullen ausgeben
  382.     
  383.  
  384.                                                                        Seite 7
  385.  
  386.  
  387.        RWRIB   a) Realwert positioniert mit führenden Blanks ausgeben
  388.        DREAD   a) Datumsformat positioniert einlesen
  389.                b) Datumsformat positioniert korrigieren
  390.        DWRI    a) Datumsformat positioniert ausgeben
  391.        FMEL    a) Fehlermeldung positioniert ausgeben
  392.        TAST    a) Zeichen im Wartestatus von der Tastatur einlesen
  393.                b) Zeichen nicht wartend aus dem Tastaturpuffer lesen
  394.     
  395.  
  396.                                                                        Seite 8
  397.  
  398.  
  399.        ╔══════════════════════════════════════════════════════════════════════╗
  400.        ║Beschreibung der Subroutine AREAD (TEXT,LAN,ZEI,SP,COL,SON,ART)       ║
  401.        ║Die Subroutine ermöglicht das Lesen oder die Korrektur eines          ║
  402.        ║Textstrings von der Tastatur aus. Die Tasten des Cursorblocks können  ║
  403.        ║dabei mitbenutzt werden. Der Text wird positioniert in einem farb-    ║
  404.        ║inversen Feld, nach dem Betätigen einer Abschlußtaste in einem        ║
  405.        ║farbnormalen Feld am Bildschirm dargestellt. In der selben Zeile      ║
  406.        ║hinter dem Textfeld positionierte Texte (z. B. aus der Subroutine     ║
  407.        ║FMEL) können bis zum Ende der Zeile gelöscht werden. Außer der        ║
  408.        ║<Return>-Taste können weitere Tasten zum Abschluß der Routine benutzt ║
  409.        ║werden, die als Bitmuster übergeben werden. Das Bitmuster der zum     ║
  410.        ║Abschluß verwendeten Taste wird an das rufende Programm zurückgegeben.║
  411.        ║Ob der in der Textvariablen bei der Übergabe vorhandene Text          ║
  412.        ║korrigiert werden soll oder ob ein neuer Text eingelesen werden soll  ║
  413.        ║ergibt sich aus dem Flag, das im letzten Parameter übergeben wird.    ║
  414.        ║In dem Flag wird zurückgegeben, ob der gelesene bzw. korrigierte Text ║
  415.        ║nur aus Blanks besteht oder nicht.                                    ║
  416.        ╟──────────────────────────────────────────────────────────────────────╢
  417.        ║Parameter:                                                            ║
  418.        ║CHARACTERSTRING  Zu lesenden oder zu korrigierender Text.             ║
  419.        ║                 Return: gelesener oder korrigierter Text.            ║
  420.        ║INTEGER          Maximale Anzahl der zu bearbeitenden Zeichen         ║
  421.        ║                 1 bis 80).                                           ║
  422.        ║INTEGER          Bildschirmzeile in die der zu bearbeitende Text      ║
  423.        ║                 angezeigt werden soll (1 bis 25).                    ║
  424.        ║INTEGER          Bildschirmspalte in die der zu bearbeitende Text     ║
  425.        ║                 angezeigt werden soll (1 bis 80)                     ║
  426.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  427.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  428.        ║                 im Schwarz/weiß-Modus.                               ║
  429.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  430.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  431.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  432.        ║                 Bit 7    : blinken                                   ║
  433.        ║INTEGER          Bitmuster für Abschlußtasten und Sonderfunktion      ║
  434.        ║                      1: Text hinter Korrekturfeld löschen            ║
  435.        ║                      2: <Cursor rechts>-Taste                        ║
  436.        ║                      4: <Cursor links>-Taste                         ║
  437.        ║                      8: <Cursor aufwärts>-Taste                      ║
  438.        ║                     16: <Cursor abwärts>-Taste                       ║
  439.        ║                     32: <Bild aufwärts>-Taste                        ║
  440.        ║                     64: <Bild abwärts>-Taste                         ║
  441.        ║                    128: <Tabulator rechts>-Taste                     ║
  442.        ║                    256: <Tabulator links>-Taste                      ║
  443.        ║                    512: <Escape>-Taste                               ║
  444.        ║                   1024: <F1>-Taste                                   ║
  445.        ║                   2048: <F2>-Taste                                   ║
  446.        ║                   4096: <F3>-Taste                                   ║
  447.        ║                   8192: <F4>-Taste                                   ║
  448.        ║                  16384: <F5>-Taste                                   ║
  449.        ║                  32768: <F6>-Taste                                   ║
  450.        ║                  65536: <F7>-Taste                                   ║
  451.        ║                 131072: <F8>-Taste                                   ║
  452.        ║                 262144: <F9>-Taste                                   ║
  453.        ║                 524288: <F10>-Taste                                  ║
  454.     
  455.  
  456.                                                                        Seite 9
  457.  
  458.  
  459.        ║                 Die Funktionen können durch Addition miteinander     ║
  460.        ║                 verknüpft werden.                                    ║
  461.        ║                 Return: Bitmuster der Abschlußtaste ( <Return> = 1 ) ║
  462.        ║INTEGER          Flag, das aussagt, ob neuer Text eingelesen werden   ║
  463.        ║                 soll oder ob vorhandener Text korrigiert werden soll.║
  464.        ║                 0: Neuen Text einlesen                               ║
  465.        ║                 1: Vorhandenen Text korrigieren. Vorhandene Zeichen  ║
  466.        ║                    werden überschrieben oder werden übernommen.      ║
  467.        ║                 2: Vorhandenen Text erhalten, bis das erste Zeichen  ║
  468.        ║                    geschrieben wird.                                 ║
  469.        ║                 Return: Flag, das anzeigt, ob der Text nur aus Blanks║
  470.        ║                 und Nullcharacters besteht oder nicht.               ║
  471.        ║                 0: Text besteht nur aus Blanks oder Nullcharacters   ║
  472.        ║                 1: Text besteht aus Zeichen                          ║
  473.        ╟──────────────────────────────────────────────────────────────────────╢
  474.        ║Subroutinen:     ATTCOL,CTBUF                                         ║
  475.        ╟──────────────────────────────────────────────────────────────────────╢
  476.        ║Beispiele:       CALL AREAD (TEXTVA,20,10,20,23,0,0)                  ║
  477.        ║                 CALL AREAD (TESTVA,20,10,20,23,31,1)                 ║
  478.        ║                 In der ersten Programmzeile wird das Einlesen, in der║
  479.        ║                 zweiten die Korrektur des Textes im Characterstring  ║
  480.        ║                 TESTVA vorgenommen. Die Bildschirmausgabe erfolgt    ║
  481.        ║                 jeweils in der 10. Zeile und ab der 20. Bildschirm-  ║
  482.        ║                 spalte in hellgrauer Farbe auf blauem Hintergrund.   ║
  483.        ║                 Der hinter dem Textfeld positionierte Text bleibt im ║
  484.        ║                 ersten Fall erhalten, im zweiten Beispiel wird er    ║
  485.        ║                 gelöscht. Außerdem ist der Abschluß der Textkorrektur║
  486.        ║                 im zweiten Beispiel durch alle Cursortasten möglich. ║
  487.        ╚══════════════════════════════════════════════════════════════════════╝
  488.     
  489.  
  490.                                                                       Seite 10
  491.  
  492.  
  493.        ╔=═════════════════════════════════════════════════════════════════════╗
  494.        ║Beschreibung der Subroutine                                           ║
  495.        ║AREADZ (TEXT,LAN,ZULZ,LANZ,ZEI,SP,COL,SON,ART)                        ║
  496.        ║Die Subroutine ermöglicht das Lesen oder die Korrektur eines          ║
  497.        ║Textstrings von der Tastatur aus. Die Tasten des Cursorblocks können  ║
  498.        ║dabei mitbenutzt werden. Der Text wird positioniert in einem farb-    ║
  499.        ║inversen Feld, nach dem Betätigen einer Abschlußtaste in einem        ║
  500.        ║farbnormalen Feld am Bildschirm dargestellt. In der selben Zeile      ║
  501.        ║hinter dem Textfeld positionierte Texte (z. B. aus der Subroutine     ║
  502.        ║FMEL) können bis zum Ende der Zeile gelöscht werden. Außer der        ║
  503.        ║<Return>-Taste können weitere Tasten zum Abschluß der Routine benutzt ║
  504.        ║werden, die als Bitmuster übergeben werden. Das Bitmuster der zum     ║
  505.        ║Abschluß verwendeten Taste wird an das rufende Programm zurückgegeben.║
  506.        ║Ob der in der Textvariablen bei der Übergabe vorhandene Text          ║
  507.        ║korrigiert werden soll oder ob ein neuer Text eingelesen werden soll  ║
  508.        ║ergibt sich aus dem Flag, das im letzten Parameter übergeben wird.    ║
  509.        ║In dem Flag wird zurückgegeben, ob der gelesene bzw. korrigierte Text ║
  510.        ║nur aus Blanks besteht oder nicht. Im zweiten Parameter werden die    ║
  511.        ║zur Korrektur oder zum Lesen zugelassenen Zeichen als String          ║
  512.        ║an die Routine übergeben.                                             ║
  513.        ╟──────────────────────────────────────────────────────────────────────╢
  514.        ║Parameter:                                                            ║
  515.        ║CHARACTERSTRING  Zu lesenden oder zu korrigierender Text.             ║
  516.        ║                 Return: gelesener oder korrigierter Text.            ║
  517.        ║INTEGER          Maximale Anzahl der zu bearbeitenden Zeichen         ║
  518.        ║                 1 bis 80).                                           ║
  519.        ║CHARACTERSTRING  Zum Lesen oder Korrigieren zugelassene Zeichen.      ║
  520.        ║INTEGER          Anzahl der zugelassenen Zeichen.                     ║
  521.        ║INTEGER          Bildschirmzeile in die der zu bearbeitende Text      ║
  522.        ║                 angezeigt werden soll (1 bis 25).                    ║
  523.        ║INTEGER          Bildschirmspalte in die der zu bearbeitende Text     ║
  524.        ║                 angezeigt werden soll (1 bis 80)                     ║
  525.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  526.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  527.        ║                 im Schwarz/weiß-Modus.                               ║
  528.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  529.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  530.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  531.        ║                 Bit 7    : blinken                                   ║
  532.        ║INTEGER          Bitmuster für Abschlußtasten und Sonderfunktion      ║
  533.        ║                      1: Text hinter Korrekturfeld löschen            ║
  534.        ║                      2: <Cursor rechts>-Taste                        ║
  535.        ║                      4: <Cursor links>-Taste                         ║
  536.        ║                      8: <Cursor aufwärts>-Taste                      ║
  537.        ║                     16: <Cursor abwärts>-Taste                       ║
  538.        ║                     32: <Bild aufwärts>-Taste                        ║
  539.        ║                     64: <Bild abwärts>-Taste                         ║
  540.        ║                    128: <Tabulator rechts>-Taste                     ║
  541.        ║                    256: <Tabulator links>-Taste                      ║
  542.        ║                    512: <Escape>-Taste                               ║
  543.        ║                   1024: <F1>-Taste                                   ║
  544.        ║                   2048: <F2>-Taste                                   ║
  545.        ║                   4096: <F3>-Taste                                   ║
  546.        ║                   8192: <F4>-Taste                                   ║
  547.        ║                  16384: <F5>-Taste                                   ║
  548.     
  549.  
  550.                                                                       Seite 11
  551.  
  552.  
  553.        ║                  32768: <F6>-Taste                                   ║
  554.        ║                  65536: <F7>-Taste                                   ║
  555.        ║                 131072: <F8>-Taste                                   ║
  556.        ║                 262144: <F9>-Taste                                   ║
  557.        ║                 524288: <F10>-Taste                                  ║
  558.        ║                 Die Funktionen können durch Addition miteinander     ║
  559.        ║                 verknüpft werden.                                    ║
  560.        ║                 Return: Bitmuster der Abschlußtaste ( <Return> = 1 ) ║
  561.        ║INTEGER          Flag, das aussagt, ob neuer Text eingelesen werden   ║
  562.        ║                 soll oder ob vorhandener Text korrigiert werden soll.║
  563.        ║                 0: Neuen Text einlesen                               ║
  564.        ║                 1: Vorhandenen Text korrigieren. Vorhandene Zeichen  ║
  565.        ║                    werden überschrieben oder werden übernommen.      ║
  566.        ║                 2: Vorhandenen Text erhalten, bis das erste Zeichen  ║
  567.        ║                    geschrieben wird.                                 ║
  568.        ║                 Return: Flag, das anzeigt, ob der Text nur aus Blanks║
  569.        ║                 und Nullcharacters besteht oder nicht.               ║
  570.        ║                 0: Text besteht nur aus Blanks oder Nullcharacters   ║
  571.        ║                 1: Text besteht aus Zeichen                          ║
  572.        ╟──────────────────────────────────────────────────────────────────────╢
  573.        ║Subroutinen:     ATTCOL,CTBUF                                         ║
  574.        ╟──────────────────────────────────────────────────────────────────────╢
  575.        ║Beispiele:       CALL AREADZ (TEXTVA,20,'1234567890',13,10,20,23,0,0) ║
  576.        ║                 CALL AREADZ (TESTVA,20,'ABC',3,10,20,23,31,1)        ║
  577.        ║                 In der ersten Programmzeile wird das Einlesen, in der║
  578.        ║                 zweiten die Korrektur des Textes im Characterstring  ║
  579.        ║                 TESTVA vorgenommen. Die Bildschirmausgabe erfolgt    ║
  580.        ║                 jeweils in der 10. Zeile und ab der 20. Bildschirm-  ║
  581.        ║                 spalte in hellgrauer Farbe auf blauem Hintergrund.   ║
  582.        ║                 Der hinter dem Textfeld positionierte Text bleibt im ║
  583.        ║                 ersten Fall erhalten, im zweiten Beispiel wird er    ║
  584.        ║                 gelöscht. Außerdem ist der Abschluß der Textkorrektur║
  585.        ║                 im zweiten Beispiel durch alle Cursortasten möglich. ║
  586.        ║                 Im ersten Beispiel sind nur numerische Zeichen       ║
  587.        ║                 zugelassen, im zweiten Beispiel nur die Zeichen ABC. ║
  588.        ╚══════════════════════════════════════════════════════════════════════╝
  589.     
  590.  
  591.                                                                       Seite 12
  592.  
  593.  
  594.        ╔==════════════════════════════════════════════════════════════════════╗
  595.        ║Beschreibung der Subroutine AREADP (TEXT,LAN,ZEI,SP,POS,COL,SON,ART)  ║
  596.        ║Die Subroutine ermöglicht das Lesen oder die Korrektur eines          ║
  597.        ║Textstrings von der Tastatur aus. Die Tasten des Cursorblocks können  ║
  598.        ║dabei mitbenutzt werden. Der Text wird positioniert in einem farb-    ║
  599.        ║inversen Feld, nach dem Betätigen einer Abschlußtaste in einem        ║
  600.        ║farbnormalen Feld am Bildschirm dargestellt. In der selben Zeile      ║
  601.        ║hinter dem Textfeld positionierte Texte (z. B. aus der Subroutine     ║
  602.        ║FMEL) können bis zum Ende der Zeile gelöscht werden. Außer der        ║
  603.        ║<Return>-Taste können weitere Tasten zum Abschluß der Routine benutzt ║
  604.        ║werden, die als Bitmuster übergeben werden. Das Bitmuster der zum     ║
  605.        ║Abschluß verwendeten Taste wird an das rufende Programm zurückgegeben.║
  606.        ║Ob der in der Textvariablen bei der Übergabe vorhandene Text          ║
  607.        ║korrigiert werden soll oder ob ein neuer Text eingelesen werden soll  ║
  608.        ║ergibt sich aus dem Flag, das im letzten Parameter übergeben wird.    ║
  609.        ║In dem Flag wird zurückgegeben, ob der gelesene bzw. korrigierte Text ║
  610.        ║nur aus Blanks besteht oder nicht. Die relative Startposition des     ║
  611.        ║Cursors wird der Subroutine in der Variablen POS mitgeteilt. Nach     ║
  612.        ║dem Abschluß der Subroutine steht darin die aktuelle relative Position║
  613.        ║des Cursors.                                                          ║
  614.        ╟──────────────────────────────────────────────────────────────────────╢
  615.        ║Parameter:                                                            ║
  616.        ║CHARACTERSTRING  Zu lesenden oder zu korrigierender Text.             ║
  617.        ║                 Return: gelesener oder korrigierter Text.            ║
  618.        ║INTEGER          Maximale Anzahl der zu bearbeitenden Zeichen         ║
  619.        ║                 1 bis 80).                                           ║
  620.        ║INTEGER          Bildschirmzeile in die der zu bearbeitende Text      ║
  621.        ║                 angezeigt werden soll (1 bis 25).                    ║
  622.        ║INTEGER          Bildschirmspalte in die der zu bearbeitende Text     ║
  623.        ║                 angezeigt werden soll (1 bis 80)                     ║
  624.        ║INTEGER          Relative Startposition des Cursors.                  ║
  625.        ║                 Return: aktuelle relative Position des Cursors.      ║
  626.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  627.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  628.        ║                 im Schwarz/weiß-Modus.                               ║
  629.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  630.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  631.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  632.        ║                 Bit 7    : blinken                                   ║
  633.        ║INTEGER          Bitmuster für Abschlußtasten und Sonderfunktion      ║
  634.        ║                      1: Text hinter Korrekturfeld löschen            ║
  635.        ║                      2: <Cursor rechts>-Taste                        ║
  636.        ║                      4: <Cursor links>-Taste                         ║
  637.        ║                      8: <Cursor aufwärts>-Taste                      ║
  638.        ║                     16: <Cursor abwärts>-Taste                       ║
  639.        ║                     32: <Bild aufwärts>-Taste                        ║
  640.        ║                     64: <Bild abwärts>-Taste                         ║
  641.        ║                    128: <Tabulator rechts>-Taste                     ║
  642.        ║                    256: <Tabulator links>-Taste                      ║
  643.        ║                    512: <Escape>-Taste                               ║
  644.        ║                   1024: <F1>-Taste                                   ║
  645.        ║                   2048: <F2>-Taste                                   ║
  646.        ║                   4096: <F3>-Taste                                   ║
  647.        ║                   8192: <F4>-Taste                                   ║
  648.        ║                  16384: <F5>-Taste                                   ║
  649.     
  650.  
  651.                                                                       Seite 13
  652.  
  653.  
  654.        ║                  32768: <F6>-Taste                                   ║
  655.        ║                  65536: <F7>-Taste                                   ║
  656.        ║                 131072: <F8>-Taste                                   ║
  657.        ║                 262144: <F9>-Taste                                   ║
  658.        ║                 524288: <F10>-Taste                                  ║
  659.        ║                 Die Funktionen können durch Addition miteinander     ║
  660.        ║                 verknüpft werden.                                    ║
  661.        ║                 Return: Bitmuster der Abschlußtaste ( <Return> = 1 ) ║
  662.        ║INTEGER          Flag, das aussagt, ob neuer Text eingelesen werden   ║
  663.        ║                 soll oder ob vorhandener Text korrigiert werden soll.║
  664.        ║                 0: Neuen Text einlesen                               ║
  665.        ║                 1: Vorhandenen Text korrigieren. Vorhandene Zeichen  ║
  666.        ║                    werden überschrieben oder werden übernommen.      ║
  667.        ║                 2: Vorhandenen Text erhalten, bis das erste Zeichen  ║
  668.        ║                    geschrieben wird.                                 ║
  669.        ║                 Return: Flag, das anzeigt, ob der Text nur aus Blanks║
  670.        ║                 und Nullcharacters besteht oder nicht.               ║
  671.        ║                 0: Text besteht nur aus Blanks oder Nullcharacters   ║
  672.        ║                 1: Text besteht aus Zeichen                          ║
  673.        ╟──────────────────────────────────────────────────────────────────────╢
  674.        ║Subroutinen:     ATTCOL,CTBUF                                         ║
  675.        ╟──────────────────────────────────────────────────────────────────────╢
  676.        ║Beispiele:       CALL AREADP (TEXTVA,20,10,20,5,23,0,0)               ║
  677.        ║                 CALL AREADP (TESTVA,20,10,20,5,23,31,1)              ║
  678.        ║                 In der ersten Programmzeile wird das Einlesen, in der║
  679.        ║                 zweiten die Korrektur des Textes im Characterstring  ║
  680.        ║                 TESTVA vorgenommen. Die Bildschirmausgabe erfolgt    ║
  681.        ║                 jeweils in der 10. Zeile und ab der 20. Bildschirm-  ║
  682.        ║                 spalte in hellgrauer Farbe auf blauem Hintergrund.   ║
  683.        ║                 Der hinter dem Textfeld positionierte Text bleibt im ║
  684.        ║                 ersten Fall erhalten, im zweiten Beispiel wird er    ║
  685.        ║                 gelöscht. Außerdem ist der Abschluß der Textkorrektur║
  686.        ║                 im zweiten Beispiel durch alle Cursortasten möglich. ║
  687.        ║                 In beiden Beispielen steht der Cursor anfangs auf dem║
  688.        ║                 5. Zeichen relativ zum Anfang des Textfeldes.        ║
  689.        ╚══════════════════════════════════════════════════════════════════════╝
  690.     
  691.  
  692.                                                                       Seite 14
  693.  
  694.  
  695.        ╔===═══════════════════════════════════════════════════════════════════╗
  696.        ║Beschreibung der Subroutine AREADM (TEXT,LAN,ZEI,COL,SON,ART)         ║
  697.        ║Die Subroutine ermöglicht das Lesen oder die Korrektur eines          ║
  698.        ║Textstrings von der Tastatur aus. Die Tasten des Cursorblocks können  ║
  699.        ║dabei mitbenutzt werden. Der Text wird positioniert in einem farb-    ║
  700.        ║inversen Feld, nach dem Betätigen einer Abschlußtaste in einem        ║
  701.        ║farbnormalen Feld am Bildschirm dargestellt. In der selben Zeile      ║
  702.        ║hinter dem Textfeld positionierte Texte (z. B. aus der Subroutine     ║
  703.        ║FMEL) können bis zum Ende der Zeile gelöscht werden. Außer der        ║
  704.        ║<Return>-Taste können weitere Tasten zum Abschluß der Routine benutzt ║
  705.        ║werden, die als Bitmuster übergeben werden. Das Bitmuster der zum     ║
  706.        ║Abschluß verwendeten Taste wird an das rufende Programm zurückgegeben.║
  707.        ║Ob der in der Textvariablen bei der Übergabe vorhandene Text          ║
  708.        ║korrigiert werden soll oder ob ein neuer Text eingelesen werden soll  ║
  709.        ║ergibt sich aus dem Flag, das im letzten Parameter übergeben wird.    ║
  710.        ║In dem Flag wird zurückgegeben, ob der gelesene bzw. korrigierte Text ║
  711.        ║nur aus Blanks besteht oder nicht. Das Lesefeld wird mittenzentriert  ║
  712.        ║in der Bildschirmzeile dargestellt.                                   ║
  713.        ╟──────────────────────────────────────────────────────────────────────╢
  714.        ║Parameter:                                                            ║
  715.        ║CHARACTERSTRING  Zu lesenden oder zu korrigierender Text.             ║
  716.        ║                 Return: gelesener oder korrigierter Text.            ║
  717.        ║INTEGER          Maximale Anzahl der zu bearbeitenden Zeichen         ║
  718.        ║                 1 bis 80).                                           ║
  719.        ║INTEGER          Bildschirmzeile in die der zu bearbeitende Text      ║
  720.        ║                 angezeigt werden soll (1 bis 25).                    ║
  721.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  722.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  723.        ║                 im Schwarz/weiß-Modus.                               ║
  724.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  725.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  726.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  727.        ║                 Bit 7    : blinken                                   ║
  728.        ║INTEGER          Bitmuster für Abschlußtasten und Sonderfunktion      ║
  729.        ║                      1: Text hinter Korrekturfeld löschen            ║
  730.        ║                      2: <Cursor rechts>-Taste                        ║
  731.        ║                      4: <Cursor links>-Taste                         ║
  732.        ║                      8: <Cursor aufwärts>-Taste                      ║
  733.        ║                     16: <Cursor abwärts>-Taste                       ║
  734.        ║                     32: <Bild aufwärts>-Taste                        ║
  735.        ║                     64: <Bild abwärts>-Taste                         ║
  736.        ║                    128: <Tabulator rechts>-Taste                     ║
  737.        ║                    256: <Tabulator links>-Taste                      ║
  738.        ║                    512: <Escape>-Taste                               ║
  739.        ║                   1024: <F1>-Taste                                   ║
  740.        ║                   2048: <F2>-Taste                                   ║
  741.        ║                   4096: <F3>-Taste                                   ║
  742.        ║                   8192: <F4>-Taste                                   ║
  743.        ║                  16384: <F5>-Taste                                   ║
  744.        ║                  32768: <F6>-Taste                                   ║
  745.        ║                  65536: <F7>-Taste                                   ║
  746.        ║                 131072: <F8>-Taste                                   ║
  747.        ║                 262144: <F9>-Taste                                   ║
  748.        ║                 524288: <F10>-Taste                                  ║
  749.        ║                 Die Funktionen können durch Addition miteinander     ║
  750.     
  751.  
  752.                                                                       Seite 15
  753.  
  754.  
  755.        ║                 verknüpft werden.                                    ║
  756.        ║                 Return: Bitmuster der Abschlußtaste ( <Return> = 1 ) ║
  757.        ║INTEGER          Flag, das aussagt, ob neuer Text eingelesen werden   ║
  758.        ║                 soll oder ob vorhandener Text korrigiert werden soll.║
  759.        ║                 0: Neuen Text einlesen                               ║
  760.        ║                 1: Vorhandenen Text korrigieren. Vorhandene Zeichen  ║
  761.        ║                    werden überschrieben oder werden übernommen.      ║
  762.        ║                 2: Vorhandenen Text erhalten, bis das erste Zeichen  ║
  763.        ║                    geschrieben wird.                                 ║
  764.        ║                 Return: Flag, das anzeigt, ob der Text nur aus Blanks║
  765.        ║                 und Nullcharacters besteht oder nicht.               ║
  766.        ║                 0: Text besteht nur aus Blanks oder Nullcharacters   ║
  767.        ║                 1: Text besteht aus Zeichen                          ║
  768.        ╟──────────────────────────────────────────────────────────────────────╢
  769.        ║Subroutinen:     ATTCOL,CTBUF                                         ║
  770.        ╟──────────────────────────────────────────────────────────────────────╢
  771.        ║Beispiele:       CALL AREADM (TEXTVA,20,10,23,0,0)                    ║
  772.        ║                 CALL AREADM (TESTVA,20,10,23,31,1)                   ║
  773.        ║                 In der ersten Programmzeile wird das Einlesen, in der║
  774.        ║                 zweiten die Korrektur des Textes im Characterstring  ║
  775.        ║                 TESTVA vorgenommen. Die Bildschirmausgabe erfolgt    ║
  776.        ║                 jeweils in der 10. Zeile mittenzentriert in hell-    ║
  777.        ║                 grauer Farbe auf blauem Hintergrund. Der hinter dem  ║
  778.        ║                 Textfeld positionierte Text bleibt im ersten Fall    ║
  779.        ║                 erhalten, im zweiten Beispiel wird er gelöscht.      ║
  780.        ║                 Außerdem ist der Abschluß der Textkorrektur im       ║
  781.        ║                 zweiten Beispiel durch alle Cursortasten möglich.    ║
  782.        ╚══════════════════════════════════════════════════════════════════════╝
  783.     
  784.  
  785.                                                                       Seite 16
  786.  
  787.  
  788.        ╔══════════════════════════════════════════════════════════════════════╗
  789.        ║Beschreibung der Subroutine AWRI (TEXT,ANZ,ZEI,SP,COL)                ║
  790.        ║Die Subroutine ermöglicht das positionierte Schreiben eines Text-     ║
  791.        ║strings auf den Bildschirm.                                           ║
  792.        ╟──────────────────────────────────────────────────────────────────────╢
  793.        ║Parameter:                                                            ║
  794.        ║CHARACTERSTRING  zu schreibender Text; hinter dem letzten zu          ║
  795.        ║                 zu schreibenden Zeichen kann ein Null-Character      ║
  796.        ║                 als Terminator angefügt werden.                      ║
  797.        ║INTEGER          Anzahl der zu schreibenden Zeichen; es werden soviele║
  798.        ║                 Zeichen geschrieben bis entweder die Anzahl erreicht ║
  799.        ║                 ist oder ein Null-Character gefunden wurde oder die  ║
  800.        ║                 Bildschirmspalte 80 beschrieben worden ist.          ║
  801.        ║INTEGER          Zeile in die geschrieben werden soll. Der Wert darf  ║
  802.        ║                 zwischen 1 und 25 liegen.                            ║
  803.        ║INTEGER          Spalte ab geschrieben werden soll; Der Wert darf     ║
  804.        ║                 zwischen 1 und 80 liegen.                            ║
  805.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  806.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  807.        ║                 im Schwarz/weiß-Modus.                               ║
  808.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  809.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  810.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  811.        ║                 Bit 7    : blinken                                   ║
  812.        ╟──────────────────────────────────────────────────────────────────────╢
  813.        ║Subroutinen:     ATTCOL                                               ║
  814.        ╟──────────────────────────────────────────────────────────────────────╢
  815.        ║Beispiele:       CALL AWRI ('Testtext'//CHAR(0),80,10,20,23)          ║
  816.        ║                 CALL AWRI ('Testtext',8,10,20,23)                    ║
  817.        ║                 Beide Programmzeilen veranlassen die Ausgabe des     ║
  818.        ║                 Wortes Testtext in der 10. Zeile des Bildschirms.    ║
  819.        ║                 Die Ausgabe erfolgt ab der 20. Bildschirmspalte in   ║
  820.        ║                 hellgrauer Farbe auf blauem Hintergrund.             ║
  821.        ╚══════════════════════════════════════════════════════════════════════╝
  822.     
  823.  
  824.                                                                       Seite 17
  825.  
  826.  
  827.        ╔=═════════════════════════════════════════════════════════════════════╗
  828.        ║Beschreibung der Subroutine AWRIM (TEXT,ANZ,ZEI,COL)                  ║
  829.        ║Die Subroutine ermöglicht das positionierte mittenzentrierte Schreiben║
  830.        ║eines Textstrings auf den Bildschirm.                                 ║
  831.        ╟──────────────────────────────────────────────────────────────────────╢
  832.        ║Parameter:                                                            ║
  833.        ║CHARACTERSTRING  zu schreibender Text; hinter dem letzten zu          ║
  834.        ║                 zu schreibenden Zeichen kann ein Null-Character      ║
  835.        ║                 als Terminator angefügt werden.                      ║
  836.        ║INTEGER          Anzahl der zu schreibenden Zeichen; es werden soviele║
  837.        ║                 Zeichen geschrieben bis entweder die Anzahl erreicht ║
  838.        ║                 ist oder ein Null-Character gefunden wurde oder die  ║
  839.        ║                 Bildschirmspalte 80 beschrieben worden ist.          ║
  840.        ║INTEGER          Zeile in die geschrieben werden soll. Der Wert darf  ║
  841.        ║                 zwischen 1 und 25 liegen.                            ║
  842.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  843.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  844.        ║                 im Schwarz/weiß-Modus.                               ║
  845.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  846.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  847.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  848.        ║                 Bit 7    : blinken                                   ║
  849.        ╟──────────────────────────────────────────────────────────────────────╢
  850.        ║Subroutinen:     ATTCOL                                               ║
  851.        ╟──────────────────────────────────────────────────────────────────────╢
  852.        ║Beispiele:       CALL AWRIM ('Testtext'//CHAR(0),80,10,23)            ║
  853.        ║                 CALL AWRIM ('Testtext',8,10,23)                      ║
  854.        ║                 Beide Programmzeilen veranlassen die Ausgabe des     ║
  855.        ║                 Wortes Testtext in der 10. Zeile des Bildschirms.    ║
  856.        ║                 Die Ausgabe erfolgt mittenzentriert in hellgrauer    ║
  857.        ║                 Farbe auf blauem Hintergrund.                        ║
  858.        ╚══════════════════════════════════════════════════════════════════════╝
  859.     
  860.  
  861.                                                                       Seite 18
  862.  
  863.  
  864.        ╔═════════════════════════════════════════════════════════════════════╗
  865.        ║Beschreibung der Subroutine IREAD (INT,FOR,ZEI,SP,COL,SON,ART)       ║
  866.        ║Die Subroutine ermöglicht die Korrektur oder das Lesen eines Integer-║
  867.        ║wertes vom Bildschirm. Die Tasten des Cursorblocks können dazu       ║
  868.        ║mitbenutzt werden. Die Darstellung erfolgt mit führenden Nullen. Wenn║
  869.        ║der Integerwert zu groß für das Darstellungsfeld ist, wird es mit dem║
  870.        ║Zeichen "#" gefüllt. Der Wert wird während der Korrektur farbinvers, ║
  871.        ║nach der Korrektur farbnormal dargestellt. In der selben Zeile hinter║
  872.        ║dem Korrekturfeld positionierte Texte (z. B. aus der Subroutine FMEL)║
  873.        ║können bis zum Ende der Zeile überschrieben werden. Neben der        ║
  874.        ║<Return>-Tasten können weitere Tasten zum Abschluß der Routine       ║
  875.        ║bestimmt werden. Ob der bei der Übergabe vorhandene Wert korrigiert  ║
  876.        ║werden soll, oder ob ein neuer Wert einzulesen ist, ergibt sich aus  ║
  877.        ║dem Flag, das im letzten Parameter übergeben wird. Im dem Flag wird  ║
  878.        ║zurückgegeben, ob sich bei der Übergabe ein Integerwert im Lese/     ║
  879.        ║Korrekturfeld befindet oder nicht.                                   ║
  880.        ╟─────────────────────────────────────────────────────────────────────╢
  881.        ║Parameter:                                                           ║
  882.        ║INTEGER          Zu korrigierender Integerwert.                      ║
  883.        ║INTEGER          Anzahl der auszuschreibenden Ziffern des            ║
  884.        ║                 Integerwertes (1 bis 11).                           ║
  885.        ║INTEGER          Bildschirmzeile in der der Integerwert korrigiert   ║
  886.        ║                 werden soll (1 bis 25).                             ║
  887.        ║INTEGER          Bildschirmspalte ab der der Integerwert korrigiert  ║
  888.        ║                 werden soll (1 bis 80).                             ║
  889.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  890.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  891.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  892.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  893.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  894.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  895.        ║                 Bit 7    : blinken                                  ║
  896.        ║INTEGER          Bitmuster für Abschlußtasten und Sonderfunktion     ║
  897.        ║                      1: Text hinter Korrekturfeld löschen           ║
  898.        ║                      2: <Cursor rechts>-Taste                       ║
  899.        ║                      4: <Cursor links>-Taste                        ║
  900.        ║                      8: <Cursor aufwärts>-Taste                     ║
  901.        ║                     16: <Cursor abwärts>-Taste                      ║
  902.        ║                     32: <Bild aufwärts>-Taste                       ║
  903.        ║                     64: <Bild abwärts>-Taste                        ║
  904.        ║                    128: <Tabulator rechts>-Taste                    ║
  905.        ║                    256: <Tabulator links>-Taste                     ║
  906.        ║                    512: <Escape>-Taste                              ║
  907.        ║                   1024: <F1>-Taste                                  ║
  908.        ║                   2048: <F2>-Taste                                  ║
  909.        ║                   4096: <F3>-Taste                                  ║
  910.        ║                   8192: <F4>-Taste                                  ║
  911.        ║                  16384: <F5>-Taste                                  ║
  912.        ║                  32768: <F6>-Taste                                  ║
  913.        ║                  65536: <F7>-Taste                                  ║
  914.        ║                 131072: <F8>-Taste                                  ║
  915.        ║                 262144: <F9>-Taste                                  ║
  916.        ║                 524288: <F10>-Taste                                 ║
  917.        ║                 Die Funktionen können durch Addition miteinander    ║
  918.        ║                 verknüpft werden.                                   ║
  919.     
  920.  
  921.                                                                       Seite 19
  922.  
  923.  
  924.        ║                 Return: Bitmuster der Abschlußtaste ( <Return> = 1 )║
  925.        ║INTEGER          Flag, das aussagt, ob neuer Wert eingelesen werden  ║
  926.        ║                 soll oder ob vorhandener Wert korrigiert werden     ║
  927.        ║                 soll.                                               ║
  928.        ║                 0: Neuen Wert einlesen                              ║
  929.        ║                 1: Vorhandenen Wert korrigieren. Vorhandene Ziffern ║
  930.        ║                    werden überschrieben oder werden übernommen.     ║
  931.        ║                 2: Vorhandenen Wert erhalten, bis die erste Zifer   ║
  932.        ║                    geschrieben wird.                                ║
  933.        ║                 Return: Flag, das anzeigt, ob der Wert im Lese/     ║
  934.        ║                 Korrekturfeld vorhanden war oder nicht.             ║
  935.        ║                 0: Wert war vorhanden                               ║
  936.        ║                 1: Es waren keinen Ziffern im Wertefeld             ║
  937.        ╟─────────────────────────────────────────────────────────────────────╢
  938.        ║Subroutinen:     AREAD, AWRI                                         ║
  939.        ╟─────────────────────────────────────────────────────────────────────╢
  940.        ║Beispiel:        CALL IREAD (IWERT,6,10,20,23,1,1)                   ║
  941.        ║                 Die Programmzeile veranlaßt die Korrektur eines in  ║
  942.        ║                 der Integervariablen IWERT enthaltenen Wertes. Die  ║
  943.        ║                 Darstellung erfolgt sechsstellig mit führenden      ║
  944.        ║                 Nullen in der 10. Zeile ab Spalte 20 in hellgrauer  ║
  945.        ║                 Farbe auf blauem Hintergrund. Hinter dem            ║
  946.        ║                 Korrekturfeld positionierter Text wird mit Blanks   ║
  947.        ║                 überschrieben.                                      ║
  948.        ╚═════════════════════════════════════════════════════════════════════╝
  949.     
  950.  
  951.                                                                       Seite 20
  952.  
  953.  
  954.        ╔═════════════════════════════════════════════════════════════════════╗
  955.        ║Beschreibung der Subroutine IWRI (INT,ANZ,ZEI,SP,COL)                ║
  956.        ║Die Subroutine ermöglicht das positionierte Schreiben eines          ║
  957.        ║Integerwertes auf den Bildschirm. Die Darstellung erfolgt mit        ║
  958.        ║führenden Nullen. Wenn der Integerwert zu groß für das Darstellungs- ║
  959.        ║feld ist, wird es mit dem Zeichen "#" gefüllt.                       ║
  960.        ╟─────────────────────────────────────────────────────────────────────╢
  961.        ║Parameter:                                                           ║
  962.        ║INTEGER          Zu schreibender Integerwert.                        ║
  963.        ║INTEGER          Anzahl der auszuschreibenden Ziffern des            ║
  964.        ║                 Integerwertes (1 bis 12).                           ║
  965.        ║INTEGER          Bildschirmzeile in die der Integerwert geschrieben  ║
  966.        ║                 werden soll (1 bis 25).                             ║
  967.        ║INTEGER          Bildschirmspalte ab der der Integerwert geschrieben ║
  968.        ║                 werden soll (1 bis 80).                             ║
  969.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  970.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  971.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  972.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  973.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  974.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  975.        ║                 Bit 7    : blinken                                  ║
  976.        ╟─────────────────────────────────────────────────────────────────────╢
  977.        ║Subroutinen:     AWRI                                                ║
  978.        ╟─────────────────────────────────────────────────────────────────────╢
  979.        ║Beispiel:        CALL IWRI (IWERT,6,10,20,23)                        ║
  980.        ║                 Die Programmzeile veranlaßt das Ausschreiben des    ║
  981.        ║                 in der Integerwariablen IWERT enthaltenen Wertes    ║
  982.        ║                 sechsstellig, gegebenenfalls mit führenden Nullen.  ║
  983.        ║                 Die Bildschirmausgabe erfolgt in der 10. Zeile ab   ║
  984.        ║                 der 20. Spalte in hellgrauer Farbe auf blauem       ║
  985.        ║                 Hintergrund.                                        ║
  986.        ╚═════════════════════════════════════════════════════════════════════╝
  987.     
  988.  
  989.                                                                       Seite 21
  990.  
  991.  
  992.        ╔═════════════════════════════════════════════════════════════════════╗
  993.        ║Beschreibung der Subroutine IWRIB (INT,ANZ,ZEI,SP,COL)               ║
  994.        ║Die Subroutine ermöglicht das positionierte Schreiben eines          ║
  995.        ║Integerwertes auf den Bildschirm. Die Darstellung erfolgt mit        ║
  996.        ║führenden Blanks. Wenn der Integerwert zu groß für das Darstellungs- ║
  997.        ║feld ist, wird es mit dem Zeichen "#" gefüllt.                       ║
  998.        ╟─────────────────────────────────────────────────────────────────────╢
  999.        ║Parameter:                                                           ║
  1000.        ║INTEGER          Zu schreibender Integerwert.                        ║
  1001.        ║INTEGER          Anzahl der auszuschreibenden Ziffern des            ║
  1002.        ║                 Integerwertes (1 bis 12).                           ║
  1003.        ║INTEGER          Bildschirmzeile in die der Integerwert geschrieben  ║
  1004.        ║                 werden soll (1 bis 25).                             ║
  1005.        ║INTEGER          Bildschirmspalte ab der der Integerwert geschrieben ║
  1006.        ║                 werden soll (1 bis 80).                             ║
  1007.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  1008.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1009.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  1010.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1011.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  1012.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1013.        ║                 Bit 7    : blinken                                  ║
  1014.        ╟─────────────────────────────────────────────────────────────────────╢
  1015.        ║Subroutinen:     AWRI                                                ║
  1016.        ╟─────────────────────────────────────────────────────────────────────╢
  1017.        ║Beispiel:        CALL IWRIB (IWERT,6,10,20,23)                       ║
  1018.        ║                 Die Programmzeile veranlaßt das Ausschreiben des    ║
  1019.        ║                 in der Integerwariablen IWERT enthaltenen Wertes    ║
  1020.        ║                 sechsstellig, gegebenenfalls mit führenden Blanks.  ║
  1021.        ║                 Die Bildschirmausgabe erfolgt in der 10. Zeile ab   ║
  1022.        ║                 der 20. Spalte in hellgrauer Farbe auf blauem       ║
  1023.        ║                 Hintergrund.                                        ║
  1024.        ╚═════════════════════════════════════════════════════════════════════╝
  1025.     
  1026.  
  1027.                                                                       Seite 22
  1028.  
  1029.  
  1030.        ╔═════════════════════════════════════════════════════════════════════╗
  1031.        ║Beschreibung der Subroutine RREAD (REAL,FOR,ZEI,SP,COL,SON,ART)      ║
  1032.        ║Die Subroutine ermöglicht die Korrektur oder das Lesen eines Real-   ║
  1033.        ║wertes am Bildschirm. Die Tasten des Cursorblocks können dazu        ║
  1034.        ║mitbenutzt werden. Die Darstellung erfolgt mit führenden Nullen. Wenn║
  1035.        ║der Realwert zu groß für das Wertefeld ist, wird es mit dem Zeichen  ║
  1036.        ║"#" gefüllt. Der Wert wird während der Bearbeitung farbinvers, danach║
  1037.        ║farbnormal am Bildschirm dargestellt. In der selben Zeile hinter dem ║
  1038.        ║Wertefeld positionierte Texte (z. B. aus der Subroutine FMEL) können ║
  1039.        ║bis zum Ende der Zeile überschrieben werden. Der Dezimalpunkt ist im ║
  1040.        ║Wertefeld dem übergebenen Fortran-Format entsprechend gesetzt, er    ║
  1041.        ║kann jedoch bei der Korrektur überschrieben werden. Die Verwendung   ║
  1042.        ║eines Kommas anstelle des Dezimalpunktes ist erlaubt. Ungültige      ║
  1043.        ║Fortran-Formate werden korrigiert zurückgegeben. Neben der <Return>- ║
  1044.        ║Taste können weitere Tasten zum Abschluß der Routine bestimmt werden.║
  1045.        ║Ob der bei der Übergabe vorhandene Realwert korrigiert werden soll,  ║
  1046.        ║oder ob ein neuer Wert einzulesen ist, ergibt sich aus dem Flag, das ║
  1047.        ║im letzten Parameter übergeben wird. Im dem Flag wird zurückgegeben, ║
  1048.        ║ob sich bei der Übergabe ein Realwert im Lese/Korrekturfeld befindet ║
  1049.        ║oder nicht.                                                          ║
  1050.        ╟─────────────────────────────────────────────────────────────────────╢
  1051.        ║Parameter:                                                           ║
  1052.        ║REAL             zu korrigierender oder zu lesender Realwert.        ║
  1053.        ║REAL             Fortran-Format für die Darstellung des Realwertes   ║
  1054.        ║                 (bis 20.9 -10 Vorkommastellen, 9 Nachkommastellen-).║
  1055.        ║                 Return: korrigiertes Fortran-Format                 ║
  1056.        ║INTEGER          Bildschirmzeile in der der Realwert bearbeitet      ║
  1057.        ║                 werden soll (1 bis 25).                             ║
  1058.        ║INTEGER          Bildschirmspalte ab der der Realwert bearbeitet     ║
  1059.        ║                 werden soll (1 bis 80).                             ║
  1060.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  1061.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1062.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  1063.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1064.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  1065.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1066.        ║                 Bit 7    : blinken                                  ║
  1067.        ║INTEGER          Bitmuster für Abschlußtasten und Sonderfunktion     ║
  1068.        ║                      1: Text hinter Korrekturfeld löschen           ║
  1069.        ║                      2: <Cursor rechts>-Taste                       ║
  1070.        ║                      4: <Cursor links>-Taste                        ║
  1071.        ║                      8: <Cursor aufwärts>-Taste                     ║
  1072.        ║                     16: <Cursor abwärts>-Taste                      ║
  1073.        ║                     32: <Bild aufwärts>-Taste                       ║
  1074.        ║                     64: <Bild abwärts>-Taste                        ║
  1075.        ║                    128: <Tabulator rechts>-Taste                    ║
  1076.        ║                    256: <Tabulator links>-Taste                     ║
  1077.        ║                    512: <Escape>-Taste                              ║
  1078.        ║                   1024: <F1>-Taste                                  ║
  1079.        ║                   2048: <F2>-Taste                                  ║
  1080.        ║                   4096: <F3>-Taste                                  ║
  1081.        ║                   8192: <F4>-Taste                                  ║
  1082.        ║                  16384: <F5>-Taste                                  ║
  1083.        ║                  32768: <F6>-Taste                                  ║
  1084.        ║                  65536: <F7>-Taste                                  ║
  1085.     
  1086.  
  1087.                                                                       Seite 23
  1088.  
  1089.  
  1090.        ║                 131072: <F8>-Taste                                  ║
  1091.        ║                 262144: <F9>-Taste                                  ║
  1092.        ║                 524288: <F10>-Taste                                 ║
  1093.        ║                 Die Funktionen können durch Addition miteinander    ║
  1094.        ║                 verknüpft werden.                                   ║
  1095.        ║                 Return: Bitmuster der Abschlußtaste ( <Return> = 1 )║
  1096.        ║INTEGER          Flag, das aussagt, ob neuer Wert eingelesen werden  ║
  1097.        ║                 soll oder ob vorhandener Wert korrigiert werden     ║
  1098.        ║                 soll.                                               ║
  1099.        ║                 0: Neuen Wert einlesen                              ║
  1100.        ║                 1: Vorhandenen Wert korrigieren. Vorhandene Ziffern ║
  1101.        ║                    werden überschrieben oder werden übernommen.     ║
  1102.        ║                 2: Vorhandenen Wert erhalten, bis die erste Zifer   ║
  1103.        ║                    geschrieben wird.                                ║
  1104.        ║                 Return: Flag, das anzeigt, ob der Wert im Lese/     ║
  1105.        ║                 Korrekturfeld vorhanden war oder nicht.             ║
  1106.        ║                 0: Wert war vorhanden                               ║
  1107.        ║                 1: Es waren keinen Ziffern im Wertefeld             ║
  1108.        ╟─────────────────────────────────────────────────────────────────────╢
  1109.        ║Subroutinen:     AREAD, AWRI, CHAWAL                                 ║
  1110.        ╟─────────────────────────────────────────────────────────────────────╢
  1111.        ║Beispiel:        CALL AREAD (RWERT,6.2,10,20,23,0,1)                 ║
  1112.        ║                 Die Programmzeile veranlaßt die Korrektur eines in  ║
  1113.        ║                 der Realvariablen RWERT enthaltenen Wertes. Die     ║
  1114.        ║                 Darstellung erfolgt mit drei Vorkommastellen und    ║
  1115.        ║                 zwei Nachkommastellen eventuell mit führenden Nullen║
  1116.        ║                 in der 10. Zeile ab Spalte 20 in hellgrauer Farbe   ║
  1117.        ║                 auf blauem Hintergrund. Hinter dem Korrekturfeld    ║
  1118.        ║                 positionierter Text wird mit Blanks überschrieben.  ║
  1119.        ╚═════════════════════════════════════════════════════════════════════╝
  1120.     
  1121.  
  1122.                                                                       Seite 24
  1123.  
  1124.  
  1125.        ╔═════════════════════════════════════════════════════════════════════╗
  1126.        ║Beschreibung der Subroutine RWRI (REAL,FOR,ZEI,SP,COL)               ║
  1127.        ║Die Subroutine ermöglicht das positionierte Schreiben eines          ║
  1128.        ║Realwertes auf den Bildschirm. Die Darstellung erfolgt mit führenden ║
  1129.        ║Nullen und Dezimalpunkt im angegebenen Fortran-Format. Wenn der      ║
  1130.        ║Realwert zu groß für das Darstellungsfeld ist, wird es mit dem       ║
  1131.        ║Zeichen "#" gefüllt. Die letzte Nachkommastelle wird gerundet. Wenn  ║
  1132.        ║ein ungültiges Fortran-Format übergeben wurde, wird es korrigiert    ║
  1133.        ║zurückgegeben.                                                       ║
  1134.        ╟─────────────────────────────────────────────────────────────────────╢
  1135.        ║Parameter:                                                           ║
  1136.        ║REAL             Zu schreibender Realwert.                           ║
  1137.        ║REAL             Fortran-Format des zu schreibenden Realwertes       ║
  1138.        ║                 (bis 22.9 -12 Vorkommastellen, 9 Nachkommastellen-).║
  1139.        ║                 Return: korrigiertes Fortran-Format.                ║
  1140.        ║INTEGER          Bildschirmzeile in die der Realwert geschrieben     ║
  1141.        ║                 werden soll (1 bis 25).                             ║
  1142.        ║INTEGER          Bildschirmspalte ab der der Realwert geschrieben    ║
  1143.        ║                 werden soll (1 bis 80).                             ║
  1144.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  1145.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1146.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  1147.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1148.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  1149.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1150.        ║                 Bit 7    : blinken                                  ║
  1151.        ╟─────────────────────────────────────────────────────────────────────╢
  1152.        ║Subroutinen:     AWRI                                                ║
  1153.        ╟─────────────────────────────────────────────────────────────────────╢
  1154.        ║Beispiel:        CALL RWRI (RWERT,6.2,10,20,23)                      ║
  1155.        ║                 Die Programmzeile veranlaßt das Ausschreiben des    ║
  1156.        ║                 in der Realvariablen RWERT enthaltenen Wertes       ║
  1157.        ║                 mit drei Vorkommastellen und zwei Nachkommastellen. ║
  1158.        ║                 Die Bildschirmausgabe erfolgt in der 10. Zeile ab   ║
  1159.        ║                 der 20. Spalte in hellgrauer Farbe auf blauem       ║
  1160.        ║                 Hintergrund.                                        ║
  1161.        ╚═════════════════════════════════════════════════════════════════════╝
  1162.     
  1163.  
  1164.                                                                       Seite 25
  1165.  
  1166.  
  1167.        ╔═════════════════════════════════════════════════════════════════════╗
  1168.        ║Beschreibung der Subroutine RWRIB (REAL,FOR,ZEI,SP,COL)              ║
  1169.        ║Die Subroutine ermöglicht das positionierte Schreiben eines          ║
  1170.        ║Realwertes auf den Bildschirm. Die Darstellung erfolgt mit führenden ║
  1171.        ║Blanks und Dezimalpunkt im angegebenen Fortran-Format. Wenn der      ║
  1172.        ║Realwert zu groß für das Darstellungsfeld ist, wird es mit dem       ║
  1173.        ║Zeichen "#" gefüllt. Die letzte Nachkommastelle wird gerundet. Wenn  ║
  1174.        ║ein ungültiges Fortran-Format übergeben wurde, wird es korrigiert    ║
  1175.        ║zurückgegeben.                                                       ║
  1176.        ╟─────────────────────────────────────────────────────────────────────╢
  1177.        ║Parameter:                                                           ║
  1178.        ║REAL             Zu schreibender Realwert.                           ║
  1179.        ║REAL             Fortran-Format des zu schreibenden Realwertes       ║
  1180.        ║                 (bis 22.9 -12 Vorkommastellen, 9 Nachkommastellen-).║
  1181.        ║                 Return: korrigiertes Fortran-Format.                ║
  1182.        ║INTEGER          Bildschirmzeile in die der Realwert geschrieben     ║
  1183.        ║                 werden soll (1 bis 25).                             ║
  1184.        ║INTEGER          Bildschirmspalte ab der der Realwert geschrieben    ║
  1185.        ║                 werden soll (1 bis 80).                             ║
  1186.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  1187.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1188.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  1189.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1190.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  1191.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1192.        ║                 Bit 7    : blinken                                  ║
  1193.        ╟─────────────────────────────────────────────────────────────────────╢
  1194.        ║Subroutinen:     AWRI                                                ║
  1195.        ╟─────────────────────────────────────────────────────────────────────╢
  1196.        ║Beispiel:        CALL RWRIB (RWERT,6.2,10,20,23)                     ║
  1197.        ║                 Die Programmzeile veranlaßt das Ausschreiben des    ║
  1198.        ║                 in der Realvariablen RWERT enthaltenen Wertes       ║
  1199.        ║                 mit drei Vorkommastellen und zwei Nachkommastellen. ║
  1200.        ║                 Die Bildschirmausgabe erfolgt in der 10. Zeile ab   ║
  1201.        ║                 der 20. Spalte in hellgrauer Farbe auf blauem       ║
  1202.        ║                 Hintergrund.                                        ║
  1203.        ╚═════════════════════════════════════════════════════════════════════╝
  1204.     
  1205.  
  1206.                                                                       Seite 26
  1207.  
  1208.  
  1209.        ╔══════════════════════════════════════════════════════════════════════╗
  1210.        ║Beschreibung der Subroutine DREAD (DATUM,ZEI,SP,COL,SON,ART)          ║
  1211.        ║Die Subroutine ermöglicht das Lesen oder die Korrektur eines          ║
  1212.        ║Datumsstrings von der Tastatur aus. Die Tasten des Cursorblocks können║
  1213.        ║dabei mitbenutzt werden. Das Datum wird positioniert in einem         ║
  1214.        ║farbinversen Feld, nach dem Betätigen einer Abschlußtaste in einem    ║
  1215.        ║farbnormalen Feld am Bildschirm dargestellt. In der selben Zeile      ║
  1216.        ║hinter dem Datumsfeld positionierte Texte (z. B. aus der Subroutine   ║
  1217.        ║FMEL) können bis zum Ende der Zeile gelöscht werden. Außer der        ║
  1218.        ║<Return>-Taste können weitere Tasten zum Abschluß der Routine benutzt ║
  1219.        ║werden, die als Bitmuster übergeben werden. Das Bitmuster der zum     ║
  1220.        ║Abschluß verwendeten Taste wird an das rufende Programm zurückgegeben.║
  1221.        ║Während der Eingabe wird eine Plausibilitätsprüfung durchgeführt.     ║
  1222.        ║Erkannte Eingabefehler werden durch einen 880-Hertz-Ton angezeigt. Die║
  1223.        ║Übernahme vom und die Rückgabe zum rufenden Programm erfolgt in der   ║
  1224.        ║Form JJJJMMTT, die Darstellung am Bildschirm erfolgt in der Form      ║
  1225.        ║TT.MM.JJJJ. Ob das vom Programm übergebene Datum korrigiert werden    ║
  1226.        ║soll oder ob ein neues Datum einzulesen ist, ergibt sich aus dem Flag,║
  1227.        ║das im letzten Parameter übergeben wird. In dem Flag wird zurück-     ║
  1228.        ║gegeben, ob das gelesene bzw. korrigierte Datum Null ist oder nicht.  ║
  1229.        ╟──────────────────────────────────────────────────────────────────────╢
  1230.        ║Parameter:                                                            ║
  1231.        ║INTEGER          Datum in der Form JJJJMMTT.                          ║
  1232.        ║                 Return: Gelesenes oder korrigiertes Datum in der Form║
  1233.        ║                 JJJJMMTT. (J = Jahr, M = Monat, T = Tag)             ║
  1234.        ║INTEGER          Bildschirmzeile, in der das zu lesende oder zu       ║
  1235.        ║                 korrigierende Datum angezeigt werden soll (1 bis 25).║
  1236.        ║INTEGER          Bildschirmspalte, ab der das zu zu lesende oder zu   ║
  1237.        ║                 korrigierende Datum angezeigt werden soll (1 bis 71).║
  1238.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  1239.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  1240.        ║                 im Schwarz/Weiß-Modus.                               ║
  1241.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  1242.        ║                 Bit 3    : Intensität der Vordergrundfarbe           ║
  1243.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  1244.        ║                 Bit 7    : blinken                                   ║
  1245.        ║INTEGER          Bitmuster für Abschlußtasten und Sonderfunktion      ║
  1246.        ║                      1: Text hinter Korrekturfeld löschen            ║
  1247.        ║                      2: <Cursor rechts>-Taste                        ║
  1248.        ║                      4: <Cursor links>-Taste                         ║
  1249.        ║                      8: <Cursor aufwärts>-Taste                      ║
  1250.        ║                     16: <Cursor abwärts>-Taste                       ║
  1251.        ║                     32: <Bild aufwärts>-Taste                        ║
  1252.        ║                     64: <Bild abwärts>-Taste                         ║
  1253.        ║                    128: <Tabulator rechts>-Taste                     ║
  1254.        ║                    256: <Tabulator links>-Taste                      ║
  1255.        ║                    512: <Escape>-Taste                               ║
  1256.        ║                   1024: <F1>-Taste                                   ║
  1257.        ║                   2048: <F2>-Taste                                   ║
  1258.        ║                   4096: <F3>-Taste                                   ║
  1259.        ║                   8192: <F4>-Taste                                   ║
  1260.        ║                  16384: <F5>-Taste                                   ║
  1261.        ║                  32768: <F6>-Taste                                   ║
  1262.        ║                  65536: <F7>-Taste                                   ║
  1263.        ║                 131072: <F8>-Taste                                   ║
  1264.     
  1265.  
  1266.                                                                       Seite 27
  1267.  
  1268.  
  1269.        ║                 262144: <F9>-Taste                                   ║
  1270.        ║                 524288: <F10>-Taste                                  ║
  1271.        ║                 Die Funktionen können durch Addition miteinander     ║
  1272.        ║                 verknüpft werden.                                    ║
  1273.        ║                 Return: Bitmuster der Abschlußtaste ( <Return> = 1 ) ║
  1274.        ║INTEGER          Flag, das aussagt, ob ein neues Datum eingelesen     ║
  1275.        ║                 werden soll oder ob ein vorhandenes Datum korrigiert ║
  1276.        ║                 werden soll.                                         ║
  1277.        ║                 0: neues Datum einlesen                              ║
  1278.        ║                 1: vorhandenes Datum korrigieren                     ║
  1279.        ║                 Return: Flag, das anzeigt, ob das gelesene oder      ║
  1280.        ║                 korrigierte Datum Null ist oder nicht.               ║
  1281.        ║                 0: Datum ist Null                                    ║
  1282.        ║                 1: Datum ist nicht Null                              ║
  1283.        ╟──────────────────────────────────────────────────────────────────────╢
  1284.        ║Subroutinen:     ATTCOL,CTBUF                                         ║
  1285.        ╟──────────────────────────────────────────────────────────────────────╢
  1286.        ║Beispiele:       CALL DREAD (DATUM,10,20,23,0,0)                      ║
  1287.        ║                 CALL DREAD (DATUM,10,20,23,255,1)                    ║
  1288.        ║                 Die erste Programmzeile veranlaßt das Einlesen, die  ║
  1289.        ║                 zweite die Korrektur eines Datums. Die Bildschirm-   ║
  1290.        ║                 ausgabe erfolgt in der 10. Zeile und ab der 20.      ║
  1291.        ║                 Spalte in hellgrauer Farbe auf blauem Hintergrund.   ║
  1292.        ║                 Der hinter dem Datumsfeld positionierte Text bleibt  ║
  1293.        ║                 im ersten Fall erhalten, im zweiten Beispiel wird er ║
  1294.        ║                 gelöscht. Außerdem ist der Abschluß im zweiten       ║
  1295.        ║                 Beispiel durch alle Cursortasten möglich.            ║
  1296.        ╚══════════════════════════════════════════════════════════════════════╝
  1297.     
  1298.  
  1299.                                                                       Seite 28
  1300.  
  1301.  
  1302.        ╔══════════════════════════════════════════════════════════════════════╗
  1303.        ║Beschreibung der Subroutine DWRI (DATUM,ZEI,SP,COL)                   ║
  1304.        ║Die Subroutine ermöglicht das positionierte Schreiben eines           ║
  1305.        ║Datumstrings auf den Bildschirm. Das Datum wird als Integervariable   ║
  1306.        ║der Form JJJJMMTT eingelesen. Die Ausgabe erfolgt in der Form         ║
  1307.        ║TT.MM.JJJJ.                                                           ║
  1308.        ╟──────────────────────────────────────────────────────────────────────╢
  1309.        ║Parameter:                                                            ║
  1310.        ║INTEGER          Datum in der Form JJJJMMTT.                          ║
  1311.        ║                 (J = Jahr, M = Monat, T = Tag)                       ║
  1312.        ║INTEGER          Bildschirmzeile, in die das Datum geschrieben werden ║
  1313.        ║                 soll (1 bis 25).                                     ║
  1314.        ║INTEGER          Bildschirmspalte, ab der das Datum geschrieben werden║
  1315.        ║                 soll (1 bis 71).                                     ║
  1316.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  1317.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  1318.        ║                 im Schwarz/Weiß-Modus.                               ║
  1319.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  1320.        ║                 Bit 3    : Intensität der Vordergrundfarbe           ║
  1321.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  1322.        ║                 Bit 7    : blinken                                   ║
  1323.        ╟──────────────────────────────────────────────────────────────────────╢
  1324.        ║Subroutinen:     ATTCOL                                               ║
  1325.        ╟──────────────────────────────────────────────────────────────────────╢
  1326.        ║Beispiel:        CALL DWRI (19890730,10,20,23)                        ║
  1327.        ║                 Die Programmzeile veranlaßt das Schreiben des Strings║
  1328.        ║                 "30.07.1989" auf den Bildschirm. Die Ausgabe         ║
  1329.        ║                 erfolgt in der 10. Zeile und ab der 20. Spalte in    ║
  1330.        ║                 hellgrauer Farbe auf blauem Hintergrund.             ║
  1331.        ╚══════════════════════════════════════════════════════════════════════╝
  1332.     
  1333.  
  1334.                                                                       Seite 29
  1335.  
  1336.  
  1337.        ╔═════════════════════════════════════════════════════════════════════╗
  1338.        ║Beschreibung der Subroutine FMEL (TEXT,ANZ,FNR,ZEI,SP,COL)           ║
  1339.        ║Die Subroutine schreibt eine Fehlermeldung positioniert auf den      ║
  1340.        ║Bildschirm. Wenn "FNR" eins ist, wird die in "TEXT" übergebene       ║
  1341.        ║Fehlermeldung an der Position "ZEI","SP" auf den Bildschirm          ║
  1342.        ║geschrieben. Wenn in "FNR" eine zwei steht, erfolgt die Ausgabe      ║
  1343.        ║um 16 Stellen nach rechts versetzt (z. B. wenn schon eine Fehler-    ║
  1344.        ║meldung vorhanden ist). Wenn in "FNR" eine drei steht, wird der      ║
  1345.        ║Standardfehlertext "Wert fehlerhaft" um 16 Stellen nach rechts       ║
  1346.        ║versetzt ausgegeben.                                                 ║
  1347.        ╟─────────────────────────────────────────────────────────────────────╢
  1348.        ║Parameter:                                                           ║
  1349.        ║CHARACTERSTRING  Fehlermeldung [max. 15 Zeichen ]; hinter dem letzten║
  1350.        ║                 zu schreibenden Zeichen kann ein Null-Character als ║
  1351.        ║                 Terminator angefügt werden.                         ║
  1352.        ║INTEGER          Anzahl der zu schreibenden Zeichen. Es werden       ║
  1353.        ║                 soviele Zeichen geschrieben, bis entweder die Anzahl║
  1354.        ║                 erreicht ist oder ein Null-Character gefunden wird  ║
  1355.        ║                 oder das 15. Zeichen geschrieben wurde.             ║
  1356.        ║INTEGER          Fehlernummer [1 bis 3].                             ║
  1357.        ║                 1: Ausgabe an der angegebenen Position.             ║
  1358.        ║                 2: Ausgabe um 16 Stellen nach rechts versetzt.      ║
  1359.        ║                 3: Ausgabe der Standardfehlermeldung um 16 Stellen  ║
  1360.        ║                    nach rechts versetzt.                            ║
  1361.        ║INTEGER          Zeile in die die Fehlermeldung geschrieben werden   ║
  1362.        ║                 soll. Der Wert darf zwischen 1 und 25 liegen.       ║
  1363.        ║INTEGER          Spalte ab der die Fehlermeldung geschrieben werden  ║
  1364.        ║                 soll (eventuell um 16 Stellen nach rechts versetzt).║
  1365.        ║                 Der Wert darf zwischen 1 und 80 liegen.             ║
  1366.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1367.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1368.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  1369.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1370.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1371.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1372.        ║                 Bit 7    : blinken                                  ║
  1373.        ║                 Die Darstellung erfolgt mit dem inversierten        ║
  1374.        ║                 Farbattribut.                                       ║
  1375.        ╟─────────────────────────────────────────────────────────────────────╢
  1376.        ║Subroutinen:     ATTRIB,AWRI                                         ║
  1377.        ╟─────────────────────────────────────────────────────────────────────╢
  1378.        ║Beispiel:        CALL FMEL ('Wert zu groß!',13,1,10,20,23)           ║
  1379.        ║                 Die Fehlermeldung erscheint in der 10. Zeile ab     ║
  1380.        ║                 Spalte 20 in blauer Farbe auf hellgrauem            ║
  1381.        ║                 Hintergrund.                                        ║
  1382.        ╚═════════════════════════════════════════════════════════════════════╝
  1383.     
  1384.  
  1385.                                                                       Seite 30
  1386.  
  1387.  
  1388.        ╔══════════════════════════════════════════════════════════════════════╗
  1389.        ║Beschreibung der Subroutine TAST (ZEICHEN,FLAG)                       ║
  1390.        ║Die Subroutine liest ein Zeichen aus der Tastatur und gibt den Code   ║
  1391.        ║des Zeichens und ein Flag über die Art des Zeichens an das rufende    ║
  1392.        ║Programm zurück. Die Subroutine kann dabei im Wartestatus oder im     ║
  1393.        ║Nichtwartestatus betrieben werden. Im Wartestatus wird die Ausführung ║
  1394.        ║des Programms unterbrochen, bis ein Zeichen aus dem Tastaturbuffer    ║
  1395.        ║gelesen werden kann. Im Nichtwartestatus wird das Programm            ║
  1396.        ║weitergeführt, wenn kein Zeichen im Tastaturbuffer vorhanden ist.     ║
  1397.        ║Dabei werden die übergebenen Parameter nicht verändert, damit die     ║
  1398.        ║Subroutine in einer Schleife betrieben werden kann.                   ║
  1399.        ╟──────────────────────────────────────────────────────────────────────╢
  1400.        ║Parameter:                                                            ║
  1401.        ║INTEGER          Return: Code des gelesenen Zeichens.                 ║
  1402.        ║INTEGER          Flag für den Wartestatus:                            ║
  1403.        ║                  0:          Nichtwartestatus                        ║
  1404.        ║                 ungleich 0: Wartestatus                              ║
  1405.        ║                 Return: Flag für die Art des gelesenen Zeichens:     ║
  1406.        ║                  1:  Zeichen 'A' - 'Z' und Ä, Ö, Ü                   ║
  1407.        ║                  2:  Zeichen 'a' - 'z' und ä, ö, ü, ß                ║
  1408.        ║                  3:  Zeichen '0' - '9', '+', '-' oder '.'            ║
  1409.        ║                  4:  Restliche ASCII-Zeichen                         ║
  1410.        ║                  5:  Return- oder Entertaste                         ║
  1411.        ║                  6:  CTRL-C-Taste                                    ║
  1412.        ║                  7:  Steuercodes 0 - 31                              ║
  1413.        ║                 10:  Curser-Steuertasten                             ║
  1414.        ║                 11:  Funktionstasten 1 - 40                          ║
  1415.        ║                 12:  ALT-Taste und numerisches oder alphanumerisches ║
  1416.        ║                      Zeichen                                         ║
  1417.        ║                 13:  CTRL-Taste und Curser-Steuertaste               ║
  1418.        ╟──────────────────────────────────────────────────────────────────────╢
  1419.        ║Beispiel:        J=1                                                  ║
  1420.        ║                 CALL TAST (I,J)                                      ║
  1421.        ║                 Die Routine wartet, bis ein Zeichen aus dem          ║
  1422.        ║                 Tastaturbuffer gelesen werden kann. in I wird der    ║
  1423.        ║                 Code des Zeichens, in J ein Flag über die Art des    ║
  1424.        ║                 Zeichens übergeben.                                  ║
  1425.        ╚══════════════════════════════════════════════════════════════════════╝
  1426.     
  1427.  
  1428.                                                                       Seite 31
  1429.  
  1430.  
  1431.        Blockweise Ein- und Ausgabe am Bildschirm
  1432.  
  1433.        Unter blockweiser Ein- und Ausgabe am Bildschirm ist die lesende oder
  1434.        schreibende Bearbeitung eines Bildschirmausschnitts oder des ganzen
  1435.        Bildschirms gemeint.  Bildschirmausschnitte können dabei durch
  1436.        Positions- und Größenangaben positioniert und dimensioniert werden.  Die
  1437.        Farbe des Hinter- und Vordergrunds des Bildschirmausschnitts kann durch
  1438.        die Wahl eines Farbattributs bestimmt werden.  Eine Liste mit allen
  1439.        möglichen Farbattributen befindet sich im Anhang des Benutzerhandbuchs.
  1440.  
  1441.  
  1442.        Subroutinen zur blockweisen Ein- und Ausgabe am Bildschirm
  1443.  
  1444.        LOES    a) Bildschirmausschnitt mit Hintergrundfarbe löschen
  1445.                b) Bildschirmausschnitt mit Zeichen beschreiben
  1446.        RAHM    a) Bildschirmausschnitt umrahmen
  1447.        SCREEN  a) Text eines Bildschirmausschnitts in ein Feld einlesen
  1448.                b) Attribute eines Bildschirmausschnitts in ein Feld einlesen
  1449.                c) Inhalt eines Characterfeldes in einem Bildschirmausschnitt
  1450.                   ausgeben
  1451.                d) Inhalt eines Characterfeldes als Farbattribute eines
  1452.                   Bildschirmausschnitts ausgeben
  1453.                e) Text und Attribute eines Bildschirmausschnitts in ein Feld
  1454.                   einlesen
  1455.                f) Text und Attribute aus einem Characterfeld in einen
  1456.                   Bildschirmausschnitt schreiben
  1457.        WIND    a) Bildschirmausschnitt aufwärts scrollen
  1458.                b) Bildschirmausschnitt abwärts scrollen
  1459.     
  1460.  
  1461.                                                                       Seite 32
  1462.  
  1463.  
  1464.        ╔═════════════════════════════════════════════════════════════════════╗
  1465.        ║Beschreibung der Subroutine LOES (H,B,ZEI,SP,ZEICH,COL,ART)          ║
  1466.        ║Die Subroutine löscht einen Bildschirmausschnitt bzw. überschreibt   ║
  1467.        ║ihn mit dem in "ZEICH" angegebenen Zeichen und dem in "COL"          ║
  1468.        ║angegebenen Farbattribut. Das Farbattribut kann dem Inhalt von "ART" ║
  1469.        ║entsprechend variiert werden.                                        ║
  1470.        ╟─────────────────────────────────────────────────────────────────────╢
  1471.        ║Parameter:                                                           ║
  1472.        ║INTEGER          Höhe des zu löschenden Bildschirmausschnittes in    ║
  1473.        ║                 Zeilen [1 BIS 43].                                  ║
  1474.        ║INTEGER          Breite des zu löschenden Bildschirmausschnittes in  ║
  1475.        ║                 Spalten [1 bis 80].                                 ║
  1476.        ║INTEGER          Zeile von der an gelöscht werden soll [1 bis 43].   ║
  1477.        ║INTEGER          Spalte von der an gelöscht werden soll [1 bis 80].  ║
  1478.        ║INTEGER          ASCII-Code des Zeichens, mit dem gelöscht werden    ║
  1479.        ║                 soll [0 bis 255].                                   ║
  1480.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1481.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1482.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  1483.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1484.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1485.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1486.        ║                 Bit 7    : blinken                                  ║
  1487.        ║INTEGER          Art der Darstellung:                                ║
  1488.        ║                 0:  Farbattribut normal                             ║
  1489.        ║                 1:  Farbattribut inverse                            ║
  1490.        ║                 2:  Farbattribut intensiv                           ║
  1491.        ║                 3:  Farbattribut blinkend                           ║
  1492.        ║                 4:  Farbattribut intensiv/inverse                   ║
  1493.        ║                 5:  Farbattribut normal im 40 Zeichen/Zeile-Modus   ║
  1494.        ╟─────────────────────────────────────────────────────────────────────╢
  1495.        ║Subroutinen:     ATTRIB,POKE,SCPRF                                   ║
  1496.        ╟─────────────────────────────────────────────────────────────────────╢
  1497.        ║Beispiel:        CALL LOES (10,10,10,20,32,23,0)                     ║
  1498.        ║                 Ab der 10. Zeile und der 20. Spalte wird ein        ║
  1499.        ║                 Bildschirmfenster von 10 mal 10 Zeichen Größe mit   ║
  1500.        ║                 Blanks überschrieben. Das gelöschte Feld hat eine   ║
  1501.        ║                 blaue Farbe.                                        ║
  1502.        ╚═════════════════════════════════════════════════════════════════════╝
  1503.     
  1504.  
  1505.                                                                       Seite 33
  1506.  
  1507.  
  1508.        ╔═════════════════════════════════════════════════════════════════════╗
  1509.        ║Beschreibung der Subroutine RAHM (H,B,ZEI,SP,FORM,COL,ART)           ║
  1510.        ║Die Subroutine zeichnet einen Rahmen mit der in "FORM" angegebenen   ║
  1511.        ║Form positioniert auf den Bildschirm. Der Rahmen wird mit dem in     ║
  1512.        ║"COL" angegebenen Farbattribut dargestellt. Das Farbattribut kann    ║
  1513.        ║dem Inhalt von "ART" entsprechend variiert werden.                   ║
  1514.        ╟─────────────────────────────────────────────────────────────────────╢
  1515.        ║Parameter:                                                           ║
  1516.        ║INTEGER          Höhe des Rahmens in Zeilen [3 bis 43].              ║
  1517.        ║INTEGER          Breite des Rahmens in Spalten [3 bis 80].           ║
  1518.        ║INTEGER          Zeile von der an der Rahmen gezeichnet werden soll  ║
  1519.        ║                 [1 bis 42].                                         ║
  1520.        ║INTEGER          Spalte von der an der Rahmen gezeichnet werden soll ║
  1521.        ║                 [1 bis 79].                                         ║
  1522.        ║INTEGER          Kennung für die Rahmenform:                         ║
  1523.        ║                 0:  ╔                                               ║
  1524.        ║                 1:  ┌                                               ║
  1525.        ║                 2:  █                                               ║
  1526.        ║                 3:  *                                               ║
  1527.        ║                 4:  Blank                                           ║
  1528.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1529.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1530.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  1531.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1532.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1533.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1534.        ║                 Bit 7    : blinken                                  ║
  1535.        ║INTEGER          Art der Darstellung:                                ║
  1536.        ║                 0:  Farbattribut normal                             ║
  1537.        ║                 1:  Farbattribut inverse                            ║
  1538.        ║                 2:  Farbattribut intensiv                           ║
  1539.        ║                 3:  Farbattribut blinkend                           ║
  1540.        ║                 4:  Farbattribut intensiv/inverse                   ║
  1541.        ║                 5:  Farbattribut normal im 40 Zeichen/Zeile-Modus   ║
  1542.        ╟─────────────────────────────────────────────────────────────────────╢
  1543.        ║Subroutinen:     ATTRIB,POKE,SCPRF                                   ║
  1544.        ╟─────────────────────────────────────────────────────────────────────╢
  1545.        ║Beispiel:        CALL RAHM (10,10,10,20,0,23,0)                      ║
  1546.        ║                 Ab der 10. Zeile und der 20. Spalte wird ein        ║
  1547.        ║                 Doppelrahmen von 10 mal 10 Zeichen Größe in         ║
  1548.        ║                 hellgrauer Farbe auf blauem Hintergrund gezeichnet. ║
  1549.        ╚═════════════════════════════════════════════════════════════════════╝
  1550.     
  1551.  
  1552.                                                                       Seite 34
  1553.  
  1554.  
  1555.        ╔═════════════════════════════════════════════════════════════════════╗
  1556.        ║Beschreibung der Subroutine SCREEN (ART,FELD,H,B,ZEI,SP)             ║
  1557.        ║Die Subroutine ermöglicht das positionierte Schreiben oder Lesen     ║
  1558.        ║eines Textblocks oder Farbattributblocks oder eines Text/Attribut-   ║
  1559.        ║Blocks vom bzw. zum Bildschirm.                                      ║
  1560.        ╟─────────────────────────────────────────────────────────────────────╢
  1561.        ║Parameter:                                                           ║
  1562.        ║INTEGER          Art der Bearbeitung:                                ║
  1563.        ║                  00: Textblock vom Bildschirm lesen                 ║
  1564.        ║                  01: Block mit Farbattributen vom Bildschirm lesen  ║
  1565.        ║                  10: Textblock zum Bildschirm schreiben             ║
  1566.        ║                  11: Block mit Bildschirmattributen schreiben       ║
  1567.        ║                 100: Text und Attribute zum Bildschirm schreiben    ║
  1568.        ║                 101: Text und Attribute vom Bildschirm lesen        ║
  1569.        ║CHARACTERFELD    Feld der Form [ FELD(H)*B ] mit Text oder mit       ║
  1570.        ║                 Farbattributen, das zum Bildschirm geschrieben      ║
  1571.        ║                 werden soll;                                        ║
  1572.        ║                 oder Return: Feld der Form [ FELD(H)*B ] in das Text║
  1573.        ║                 oder Farbattribute vom Bildschirm geschrieben werden║
  1574.        ║                 soll.                                               ║
  1575.        ║INTEGER          Höhe des Text- oder Attributfeldes in Zeilen.       ║
  1576.        ║INTEGER          Breite des Text- oder Attributfeldes in Spalten.    ║
  1577.        ║INTEGER          Zeile in der Text- oder Attributfeld beginnt.       ║
  1578.        ║INTEGER          Spalte in der Text- oder Attributfeld beginnt.      ║
  1579.        ╟─────────────────────────────────────────────────────────────────────╢
  1580.        ║Subroutinen:     PEEKS,PEEK,POKES,POKE,SCPRF                         ║
  1581.        ╟─────────────────────────────────────────────────────────────────────╢
  1582.        ║Beispiel:        CHARACTER FELD(10)*60                               ║
  1583.        ║                 CALL SCREEN (0,FELD,10,60,5,8)                      ║
  1584.        ║                 Der Text der der sich in den Zeilen 5 bis 10 und den║
  1585.        ║                 Spalten 8 bis 68 auf dem Bildschirm befindet, wird  ║
  1586.        ║                 in das Characterfeld FELD eingelesen und steht dort ║
  1587.        ║                 für die spätere Weiterverarbeitung zur Verfügung.   ║
  1588.        ╚═════════════════════════════════════════════════════════════════════╝
  1589.     
  1590.  
  1591.                                                                       Seite 35
  1592.  
  1593.  
  1594.        ╔══════════════════════════════════════════════════════════════════════╗
  1595.        ║Beschreibung der Subroutine WIND (ART,ANZ,ZEIOL,SPOL,ZEIUR,SPUR,COL)  ║
  1596.        ║Die Subroutine scrollt ein mit den Diagonalkoordinaten definiertes    ║
  1597.        ║Textfenster auf dem Bildschirm ANZ Zeilen auf- oder abwärts.          ║
  1598.        ╟──────────────────────────────────────────────────────────────────────╢
  1599.        ║Parameter:                                                            ║
  1600.        ║INTEGER          Flag für die Art des Scrollens:                      ║
  1601.        ║                 0: aufwärts scrollen                                 ║
  1602.        ║                 1: abwärts scrollen                                  ║
  1603.        ║INTEGER          Anzahl der zu scrollenden Zeilen.                    ║
  1604.        ║INTEGER          Zeile der linken oberen Ecke des Textfensters        ║
  1605.        ║INTEGER          Spalte der linken oberen Ecke des Textfensters       ║
  1606.        ║INTEGER          Zeile der rechten unteren Ecke des Textfensters      ║
  1607.        ║INTEGER          Spalte der rechten unteren Ecke des Textfensters     ║
  1608.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  1609.        ║                 Monochrome-Monitor erkannt wird, erfolgt die Ausgabe ║
  1610.        ║                 im Schwarz/weiß-Modus.                               ║
  1611.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  1612.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  1613.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  1614.        ║                 Bit 7    : blinken                                   ║
  1615.        ╟──────────────────────────────────────────────────────────────────────╢
  1616.        ║Subroutinen:     ATTCOL                                               ║
  1617.        ╟──────────────────────────────────────────────────────────────────────╢
  1618.        ║Beispiel:        CALL WIND (0,1,5,10,15,70,23)                        ║
  1619.        ║                 Das Textfenster mit den Diagonalkoordinaten Zeile 5, ║
  1620.        ║                 Spalte 10 und Zeile 15, Spalte 70 wird um eine Zeile ║
  1621.        ║                 nach oben gescrollt. Die nachrückende Zeile hat eine ║
  1622.        ║                 blaue Hintergrundfarbe.                              ║
  1623.        ╚══════════════════════════════════════════════════════════════════════╝
  1624.     
  1625.  
  1626.                                                                       Seite 36
  1627.  
  1628.  
  1629.        Menüsteuerung
  1630.  
  1631.        Die Menüsteuerung ermöglicht das menügeführte Verzweigen innerhalb eines
  1632.        Programms.  Prinzipiell sind einfache und mehrfache Menüauswahlen sowie
  1633.        einfache Abfragen möglich.  Die einfache Auswahl stellt aus einer Anzahl
  1634.        Optionen eine einzige Option zur Verfügung.  Das Programm verzweigt in
  1635.        die durch die Option vorgegebene Richtung.  Eine mehrfache Auswahl wird
  1636.        notwendig, wenn mehrere Optionen während des Programmablaufs
  1637.        berücksichtigt werden sollen.  Einfache und mehrfache Auswahlen sind
  1638.        entweder cursorgesteuert oder durch die Eingabe von Kennbuchstaben
  1639.        möglich.  Neben den Menüauswahlen ist die Verzweigung innerhalb eines
  1640.        Programms durch Abfragen sinnvoll.  Abfragen erwarten als Antworten
  1641.        vorgegebene Zeichen wie z.B. "Ja" oder "Nein" oder eine Ziffer.
  1642.  
  1643.  
  1644.        Subroutinen zur Menüsteuerung
  1645.  
  1646.        MENTXT  a) Text aus einer direct organisierten Datei in Form eines ein-
  1647.                   oder mehrspaltigen Menüs auf dem Bildschirm positionieren
  1648.        VARTXT  a) Text aus einem Characterfeld in Form eines ein- oder
  1649.                   mehrspaltigen Menüs auf dem Bildschirm positionieren
  1650.        MENAKT  a) einfache cursorgesteuerte Menüauswahl
  1651.                b) mehrfache cursorgesteuerte Menüauswahl
  1652.                c) mehrfache cursorgesteuerte Menüauswahl unter Berücksichtigung
  1653.                   vorher ausgewählter Menüpunkte
  1654.                d) mehrfache cursorgesteuerte Menüauswahl unter Berücksichtigung
  1655.                   der Auswahlreihenfolge
  1656.        MEAAKT  a) einfache cursorgesteuerte Menüauswahl mit Abschlußtasten
  1657.                b) mehrfache cursorgesteuerte Menüauswahl mit Abschlußtasten
  1658.                c) mehrfache cursorgesteuerte Menüauswahl mit Abschlußtasten
  1659.                   unter Berücksichtigung vorher ausgewählter Menüpunkte
  1660.                d) mehrfache cursorgesteuerte Menüauswahl mit Abschlußtasten
  1661.                   unter Berücksichtigung der Auswahlreihenfolge
  1662.        OPTION  a) einfache oder mehrfache Menüauswahl mit Kennbuchstaben
  1663.        FRAG    a) Abfrage für die Antworten "J", "N", "j" oder "n"
  1664.        ZIFRAG  a) Abrage für die Antwort mit den Ziffern "0" bis "9"
  1665.     
  1666.  
  1667.                                                                       Seite 37
  1668.  
  1669.  
  1670.        ╔═════════════════════════════════════════════════════════════════════╗
  1671.        ║Beschreibung der Subroutine MENTXT (ANZ,LAN,SPZ,ZEI,SP,UNIT,SNR,COL) ║
  1672.        ║Die Subroutine liest aus einer direkt organisierten Datei Texte und  ║
  1673.        ║bringt diese in der Form eines Menüfeldes auf den Bildschirm. Das    ║
  1674.        ║Menüfeld wird mit einen Rahmen umgeben. Die Subroutine dient zur     ║
  1675.        ║Vorbereitung der Menütexte für die Subroutine MENAKT.                ║
  1676.        ╟─────────────────────────────────────────────────────────────────────╢
  1677.        ║Parameter:                                                           ║
  1678.        ║INTEGER          Anzahl der zur Verfügung stehenden Menütexte        ║
  1679.        ║                 [1 bis 200].                                        ║
  1680.        ║INTEGER          Länge jedes dargestellten Menütextes [1 bis 80]     ║
  1681.        ║INTEGER          Anzahl der pro Zeile dargestellten Menütexte        ║
  1682.        ║                 [1 bis 40].                                         ║
  1683.        ║INTEGER          Zeile in der das Menüfeld beginnt (Rahmen)          ║
  1684.        ║INTEGER          Spalte in der das Menüfeld beginnt [1 bis 78] oder  ║
  1685.        ║                 100 für automatische Mittenzentrierung des          ║
  1686.        ║                 Menüfeldes (Rahmen) oder 200 für automatische       ║
  1687.        ║                 Mittenzentrierung und Ausgleich einer ungeraden     ║
  1688.        ║                 Darstellungsbreite (Rahmen).                        ║
  1689.        ║INTEGER          Unit der direkt organisierten Datei, aus der die    ║
  1690.        ║                 Menütexte gelesen werden sollen.                    ║
  1691.        ║INTEGER          Satznummer des ersten Menütextes in der direkt      ║
  1692.        ║                 organisierten Datei.                                ║
  1693.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1694.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1695.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  1696.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1697.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1698.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1699.        ║                 Bit 7    : blinken                                  ║
  1700.        ╟─────────────────────────────────────────────────────────────────────╢
  1701.        ║Subroutinen:     AWRI,RAHM                                           ║
  1702.        ╟─────────────────────────────────────────────────────────────────────╢
  1703.        ║Beispiel:        CALL MENTXT (6,20,2,10,100,10,200,23)               ║
  1704.        ║                 Die Subroutine liest aus der Datei mit dem Unit 10  ║
  1705.        ║                 sechs Zeilen Menütext ab der Recordnummer 200.      ║
  1706.        ║                 Innerhalb eines Rahmens, der ab der 10. Zeile       ║
  1707.        ║                 mittenzentriert auf den Bildschirm gebracht wird,   ║
  1708.        ║                 werden die sechs Texte zweispaltig dargestellt. Die ║
  1709.        ║                 Texte sind dabei 20 Zeichen lang. Die Farbe des     ║
  1710.        ║                 Rahmens und der Texte ist hellgrau auf blauem       ║
  1711.        ║                 Hintergrund.                                        ║
  1712.        ╚═════════════════════════════════════════════════════════════════════╝
  1713.     
  1714.  
  1715.                                                                       Seite 38
  1716.  
  1717.  
  1718.        ╔═════════════════════════════════════════════════════════════════════╗
  1719.        ║Beschreibung der Subroutine VARTXT (ANZ,LAN,SPZ,ZEI,SP,FELD,COL)     ║
  1720.        ║Die Subroutine liest aus einem Characterfeld Menütexte und           ║
  1721.        ║bringt diese in der Form eines Menüfeldes auf den Bildschirm. Das    ║
  1722.        ║Menüfeld wird mit einen Rahmen umgeben. Die Subroutine dient zur     ║
  1723.        ║Vorbereitung der Menütexte für die Subroutine MENAKT.                ║
  1724.        ╟─────────────────────────────────────────────────────────────────────╢
  1725.        ║Parameter:                                                           ║
  1726.        ║INTEGER          Anzahl der zur Verfügung stehenden Menütexte        ║
  1727.        ║                 [1 bis 200].                                        ║
  1728.        ║INTEGER          Länge jedes dargestellten Menütextes [1 bis 80]     ║
  1729.        ║INTEGER          Anzahl der pro Zeile dargestellten Menütexte        ║
  1730.        ║                 [1 bis 40].                                         ║
  1731.        ║INTEGER          Zeile in der das Menüfeld beginnt (Rahmen)          ║
  1732.        ║INTEGER          Spalte in der das Menüfeld beginnt [1 bis 78] oder  ║
  1733.        ║                 100 für automatische Mittenzentrierung des          ║
  1734.        ║                 Menüfeldes (Rahmen) oder 200 für automatische       ║
  1735.        ║                 Mittenzentrierung und Ausgleich einer ungeraden     ║
  1736.        ║                 Darstellungsbreite (Rahmen).                        ║
  1737.        ║CHARACTERFELD    Feld, aus dem die Menütexte verwendet werden sollen.║
  1738.        ║                 [FELD(ANZ)*LAN]                                     ║
  1739.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1740.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1741.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  1742.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1743.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1744.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1745.        ║                 Bit 7    : blinken                                  ║
  1746.        ╟─────────────────────────────────────────────────────────────────────╢
  1747.        ║Subroutinen:     AWRI,RAHM                                           ║
  1748.        ╟─────────────────────────────────────────────────────────────────────╢
  1749.        ║Beispiel:        CALL VARTXT (6,20,2,10,100,FELD,23)                 ║
  1750.        ║                 Die Subroutine liest aus dem Feld 6 Mmenütexte ein. ║
  1751.        ║                 Innerhalb eines Rahmens, der ab der 10. Zeile       ║
  1752.        ║                 mittenzentriert auf den Bildschirm gebracht wird,   ║
  1753.        ║                 werden die sechs Texte zweispaltig dargestellt. Die ║
  1754.        ║                 Texte sind dabei 20 Zeichen lang. Die Farbe des     ║
  1755.        ║                 Rahmens und der Texte ist hellgrau auf blauem       ║
  1756.        ║                 Hintergrund.                                        ║
  1757.        ╚═════════════════════════════════════════════════════════════════════╝
  1758.     
  1759.  
  1760.                                                                       Seite 39
  1761.  
  1762.  
  1763.        ╔═════════════════════════════════════════════════════════════════════╗
  1764.        ║Beschreibung der Subroutine                                          ║
  1765.        ║MENAKT (ANZ,LAN,SPZ,ZEI,SP,ART,FELD,MZEI,MSP,COL)                    ║
  1766.        ║Die Subroutine ermöglicht die cursorgesteuerte Auswahl einer oder    ║
  1767.        ║mehrerer Optionen aus einem Menüfeld des Bildschirms. Die Texte im   ║
  1768.        ║Menüfeld müssen schon vorhanden sein (z.B. Subroutine MENTXT). Die   ║
  1769.        ║Routine gibt die ausgewählten Optionen in einem Feld zurück. In der  ║
  1770.        ║Zeile "MZEI" ab derSpalte "MSP" kann eine Meldung über die aktiven   ║
  1771.        ║Tasten und deren Aktionen angezeigt werden. Die Meldung ist bei      ║
  1772.        ║mehrfacher Auswahl 39 Zeichen, bei einfacher Auswahl nur 16 Zeichen. ║
  1773.        ║Die jeweils aktuelle Option wird mit intensivierter Farbe gezeigt,   ║
  1774.        ║ausgewählte Optionen werden inverse dargestellt.                     ║
  1775.        ╟─────────────────────────────────────────────────────────────────────╢
  1776.        ║Parameter:                                                           ║
  1777.        ║INTEGER          Anzahl der zur Verfügung stehenden Optionen         ║
  1778.        ║                 [1 bis 200].                                        ║
  1779.        ║INTEGER          Länge jedes dargestellten Menütextes [1 bis 80]     ║
  1780.        ║INTEGER          Anzahl der pro Zeile dargestellten Menütexte        ║
  1781.        ║                 [1 bis 40].                                         ║
  1782.        ║INTEGER          Zeile in der das Menüfeld beginnt (Rahmen aus       ║
  1783.        ║                 Subroutine MENTXT) [1 bis 23].                      ║
  1784.        ║INTEGER          Spalte in der das Menüfeld beginnt [1 bis 78] oder  ║
  1785.        ║                 100 für automatische Mittenzentrierung des          ║
  1786.        ║                 Menüfeldes.                                         ║
  1787.        ║INTEGER          Art der Optionsausionswahl                          ║
  1788.        ║                 -5: Mehrere Optionen können additiv ausgewählt      ║
  1789.        ║                     werden, im Feld vorhandene Auswahlen werden     ║
  1790.        ║                     gelöscht. Das Feld wird in der Reihenfolge der  ║
  1791.        ║                     Auswahl aufsteigend mit den Ziffern der         ║
  1792.        ║                     gewählten Optionsfelder belegt. Das nächste     ║
  1793.        ║                     Textfeld wird automatisch aktuell.              ║
  1794.        ║                 -4: Mehrere Optionen können additiv ausgewählt      ║
  1795.        ║                     werden, im Feld vorhandene Auswahlen bleiben    ║
  1796.        ║                     erhalten. Das nächste Textfeld wird automatisch ║
  1797.        ║                     aktuell.                                        ║
  1798.        ║                 -3: Mehrere Optionen können additiv ausgewählt      ║
  1799.        ║                     werden. Im Feld vorhandene Auswahlen werden     ║
  1800.        ║                     gelöscht. Das nächste Textfeld wird automatisch ║
  1801.        ║                     aktuell.                                        ║
  1802.        ║                 -2: Mehrere Optionen können additiv ausgewählt      ║
  1803.        ║                     werden, im Feld vorhandene Auswahlen werden     ║
  1804.        ║                     gelöscht. Das Feld wird in der Reihenfolge der  ║
  1805.        ║                     Auswahl aufsteigend mit den Ziffern der         ║
  1806.        ║                     gewählten Optionsfelder belegt. Das momentane   ║
  1807.        ║                     Textfeld bleibt aktuell.                        ║
  1808.        ║                 -1: Mehrere Optionen können additiv ausgewählt      ║
  1809.        ║                     werden, im Feld vorhandene Auswahlen bleiben    ║
  1810.        ║                     erhalten. Das momentane Textfeld bleibt aktuell.║
  1811.        ║                  0: Mehrere Optionen können additiv ausgewählt      ║
  1812.        ║                     werden. Im Feld vorhandene Auswahlen werden     ║
  1813.        ║                     gelöscht. Das momentane Textfeld bleibt aktuell.║
  1814.        ║                  1: Nur eine Option kann ausgewählt werden, im Feld ║
  1815.        ║                     vorhandene Auswahlen werden nicht dargestellt.  ║
  1816.        ║                  2: Nur eine Option kann ausgewählt werden, die     ║
  1817.        ║                     erste im Feld vorhandene Auswahl wird dem       ║
  1818.     
  1819.  
  1820.                                                                       Seite 40
  1821.  
  1822.  
  1823.        ║                     Benutzer intensiv unterlegt angeboten.          ║
  1824.        ║INTEGERFELD      Return: Optionen. Ausgewählte Optionen werden mit   ║
  1825.        ║                 der Nummer des Optionsfeldes belegt, nicht gewählte ║
  1826.        ║                 Optionen werden Null gesetzt [ FELD(ANZ) ].         ║
  1827.        ║INTEGER          Zeile in der eine Meldung über die aktiven Tasten   ║
  1828.        ║                 und deren Aktionen ausgegeben wird oder Null, wenn  ║
  1829.        ║                 keine Meldung ausgegeben werden soll oder 100, wenn ║
  1830.        ║                 in der Zeile unter dem Menüfeld ausgegeben werden   ║
  1831.        ║                 soll.                                               ║
  1832.        ║INTEGER          Spalte ab der eine Meldung über die aktiven Tasten  ║
  1833.        ║                 und deren Aktionen ausgegeben wird oder Null, wenn  ║
  1834.        ║                 keine Meldung ausgegeben werden soll oder 100, wenn ║
  1835.        ║                 mittenzentriert ausgegeben werden soll.             ║
  1836.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1837.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1838.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  1839.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1840.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1841.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1842.        ║                 Bit 7    : blinken                                  ║
  1843.        ╟─────────────────────────────────────────────────────────────────────╢
  1844.        ║Subroutinen:     ATTRIB,AWRI,CTBUF,LOES,SCREEN,TAST                  ║
  1845.        ╟─────────────────────────────────────────────────────────────────────╢
  1846.        ║Beispiel:        INTEGER FELD(6)                                     ║
  1847.        ║                 CALL MENAKT (6,20,2,10,100,1,FELD,24,34,23)         ║
  1848.        ║                 Die Menütexte müssen schon am Bildschirm vorhanden  ║
  1849.        ║                 sein (z. B. aus der Subroutine MENTXT).             ║
  1850.        ║                 Ab der 10. Zeile wird ein zweispaltiges Menüfeld    ║
  1851.        ║                 mit 6 Elementen mittenzentriert über die Menütexte  ║
  1852.        ║                 gelegt. Mit Hilfe der Cursortasten kann aus sechs   ║
  1853.        ║                 Optionen eine ausgewählt werden, deren Äquivalent   ║
  1854.        ║                 in FELD ungleich Null gesetzt wird. Das Menüfeld    ║
  1855.        ║                 hat einen blauen Hintergrund. In Zeile 24 werden    ║
  1856.        ║                 Informationen über die aktiven Tasten geschrieben.  ║
  1857.        ╚═════════════════════════════════════════════════════════════════════╝
  1858.     
  1859.  
  1860.                                                                       Seite 41
  1861.  
  1862.  
  1863.        ╔═════════════════════════════════════════════════════════════════════╗
  1864.        ║Beschreibung der Subroutine                                          ║
  1865.        ║MEAAKT (ANZ,LAN,SPZ,ZEI,SP,ART,FELD,COL,ABT)                         ║
  1866.        ║Die Subroutine ermöglicht die cursorgesteuerte Auswahl einer oder    ║
  1867.        ║mehrerer Optionen aus einem Menüfeld des Bildschirms. Die Texte im   ║
  1868.        ║Menüfeld müssen schon vorhanden sein (z.B. Subroutine MENTXT). Die   ║
  1869.        ║Routine gibt die ausgewählten Optionen in einem Feld zurück.         ║
  1870.        ║Die jeweils aktuelle Option wird mit intensivierter Farbe gezeigt,   ║
  1871.        ║ausgewählte Optionen werden inverse dargestellt. Die zur Beendigung  ║
  1872.        ║der Auswahl zugelassenen Tasten werden in ABT als Bitmuster          ║
  1873.        ║übergeben.                                                           ║
  1874.        ╟─────────────────────────────────────────────────────────────────────╢
  1875.        ║Parameter:                                                           ║
  1876.        ║INTEGER          Anzahl der zur Verfügung stehenden Optionen         ║
  1877.        ║                 [1 bis 200].                                        ║
  1878.        ║INTEGER          Länge jedes dargestellten Menütextes [1 bis 80]     ║
  1879.        ║INTEGER          Anzahl der pro Zeile dargestellten Menütexte        ║
  1880.        ║                 [1 bis 40].                                         ║
  1881.        ║INTEGER          Zeile in der das Menüfeld beginnt (Rahmen aus       ║
  1882.        ║                 Subroutine MENTXT) [1 bis 23].                      ║
  1883.        ║INTEGER          Spalte in der das Menüfeld beginnt [1 bis 78] oder  ║
  1884.        ║                 100 für automatische Mittenzentrierung des          ║
  1885.        ║                 Menüfeldes.                                         ║
  1886.        ║INTEGER          Art der Optionsausionswahl                          ║
  1887.        ║                 -5: Mehrere Optionen können additiv ausgewählt      ║
  1888.        ║                     werden, im Feld vorhandene Auswahlen werden     ║
  1889.        ║                     gelöscht. Das Feld wird in der Reihenfolge der  ║
  1890.        ║                     Auswahl aufsteigend mit den Ziffern der         ║
  1891.        ║                     gewählten Optionsfelder belegt. Das nächste     ║
  1892.        ║                     Textfeld wird automatisch aktuell.              ║
  1893.        ║                 -4: Mehrere Optionen können additiv ausgewählt      ║
  1894.        ║                     werden, im Feld vorhandene Auswahlen bleiben    ║
  1895.        ║                     erhalten. Das nächste Textfeld wird automatisch ║
  1896.        ║                     aktuell.                                        ║
  1897.        ║                 -3: Mehrere Optionen können additiv ausgewählt      ║
  1898.        ║                     werden. Im Feld vorhandene Auswahlen werden     ║
  1899.        ║                     gelöscht. Das nächste Textfeld wird automatisch ║
  1900.        ║                     aktuell.                                        ║
  1901.        ║                 -2: Mehrere Optionen können additiv ausgewählt      ║
  1902.        ║                     werden, im Feld vorhandene Auswahlen werden     ║
  1903.        ║                     gelöscht. Das Feld wird in der Reihenfolge der  ║
  1904.        ║                     Auswahl aufsteigend mit den Ziffern der         ║
  1905.        ║                     gewählten Optionsfelder belegt. Das momentane   ║
  1906.        ║                     Textfeld bleibt aktuell.                        ║
  1907.        ║                 -1: Mehrere Optionen können additiv ausgewählt      ║
  1908.        ║                     werden, im Feld vorhandene Auswahlen bleiben    ║
  1909.        ║                     erhalten. Das momentane Textfeld bleibt aktuell.║
  1910.        ║                  0: Mehrere Optionen können additiv ausgewählt      ║
  1911.        ║                     werden. Im Feld vorhandene Auswahlen werden     ║
  1912.        ║                     gelöscht. Das momentane Textfeld bleibt aktuell.║
  1913.        ║                  1: Nur eine Option kann ausgewählt werden, im Feld ║
  1914.        ║                     vorhandene Auswahlen werden nicht dargestellt.  ║
  1915.        ║                  2: Nur eine Option kann ausgewählt werden, die     ║
  1916.        ║                     erste im Feld vorhandene Auswahl wird dem       ║
  1917.        ║                     Benutzer intensiv unterlegt angeboten.          ║
  1918.     
  1919.  
  1920.                                                                       Seite 42
  1921.  
  1922.  
  1923.        ║INTEGERFELD      Return: Optionen. Ausgewählte Optionen werden mit   ║
  1924.        ║                 der Nummer des Optionsfeldes belegt, nicht gewählte ║
  1925.        ║                 Optionen werden Null gesetzt [ FELD(ANZ) ].         ║
  1926.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1927.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1928.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  1929.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1930.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1931.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  1932.        ║                 Bit 7    : blinken                                  ║
  1933.        ║INTEGER          Bitmuster für Abschlußtasten zum Beenden der        ║
  1934.        ║                 mehrfachen Auswahl:                                 ║
  1935.        ║                      1: <Return>-Taste                              ║
  1936.        ║                     32: <Bild-aufwärts>-Taste                       ║
  1937.        ║                     64: <Bild-abwärts>-Taste                        ║
  1938.        ║                    128: <Tabulator rechts>-Taste                    ║
  1939.        ║                    256: <Tabulator links>-Taste                     ║
  1940.        ║                    512: <Escape>-Taste                              ║
  1941.        ║                   1024: <F1>-Taste                                  ║
  1942.        ║                   2048: <F2>-Taste                                  ║
  1943.        ║                   4096: <F3>-Taste                                  ║
  1944.        ║                   8192: <F4>-Taste                                  ║
  1945.        ║                  16384: <F5>-Taste                                  ║
  1946.        ║                  32768: <F6>-Taste                                  ║
  1947.        ║                  65536: <F7>-Taste                                  ║
  1948.        ║                 131072: <F8>-Taste                                  ║
  1949.        ║                 262144: <F9>-Taste                                  ║
  1950.        ║                 524288: <F10>-Taste                                 ║
  1951.        ║                 Die Abschlußtasten können durch Addition miteinander║
  1952.        ║                 verknüpft werden.                                   ║
  1953.        ║                 Return: Bitmuster der Abschlußtaste                 ║
  1954.        ╟─────────────────────────────────────────────────────────────────────╢
  1955.        ║Subroutinen:     ATTRIB,AWRI,CTBUF,LOES,SCREEN,TAST                  ║
  1956.        ╟─────────────────────────────────────────────────────────────────────╢
  1957.        ║Beispiel:        INTEGER FELD(6)                                     ║
  1958.        ║                 CALL MEAAKT (6,20,2,10,100,1,FELD,23,513)           ║
  1959.        ║                 Die Menütexte müssen schon am Bildschirm vorhanden  ║
  1960.        ║                 sein (z. B. aus der Subroutine MENTXT).             ║
  1961.        ║                 Ab der 10. Zeile wird ein zweispaltiges Menüfeld    ║
  1962.        ║                 mit 6 Elementen mittenzentriert über die Menütexte  ║
  1963.        ║                 gelegt. Mit Hilfe der Cursortasten kann aus sechs   ║
  1964.        ║                 Optionen eine ausgewählt werden, deren Äquivalent   ║
  1965.        ║                 in FELD ungleich Null gesetzt wird. Das Menüfeld    ║
  1966.        ║                 hat einen blauen Hintergrund. Zum Abschluß sind die ║
  1967.        ║                 Tasten RETURN und ESCAPE zugelassen.                ║
  1968.        ╚═════════════════════════════════════════════════════════════════════╝
  1969.     
  1970.  
  1971.                                                                       Seite 43
  1972.  
  1973.  
  1974.        ╔═════════════════════════════════════════════════════════════════════╗
  1975.        ║Beschreibung der Subroutine OPTION (STRING,ANZ,MZEI,MSP,RSP,COL)     ║
  1976.        ║Die Subroutine liest in einen String ein oder mehrere der ANZ ersten ║
  1977.        ║Zeichen des Alphabets als zugelassene Antworten ein. Der zu den      ║
  1978.        ║Zeichen gehörende Text muß sich schon auf dem Bildschirm befinden.   ║
  1979.        ║Hinter dem Text "Bitte Optionen auswählen", der in Zeile MZEI und ab ║
  1980.        ║Spalte MSP auf dem Bildschirm ausgegeben wird, werden die gewählten  ║
  1981.        ║Zeichen ab Spalte RSP eingelesen. Die gewählten Zeichen werden in    ║
  1982.        ║Großbuchstaben konvertiert.                                          ║
  1983.        ╟─────────────────────────────────────────────────────────────────────╢
  1984.        ║Parameter:                                                           ║
  1985.        ║CHARACTERSTRING  Return: String, in den die gewählten Zeichen        ║
  1986.        ║                 eingelesen werden [bis zu ANZ Characters].          ║
  1987.        ║INTEGER          Anzahl der maximal auszuwählenden Optionen          ║
  1988.        ║                 [1 bis 26].                                         ║
  1989.        ║INTEGER          Zeile für den Hinweistext und für den Antwortstring ║
  1990.        ║                 [1 bis 25].                                         ║
  1991.        ║INTEGER          Spalte, in der der Hinweistext beginnt [1 bis 50].  ║
  1992.        ║INTEGER          Spalte, ab der die Antwortzeichen gelesen werden    ║
  1993.        ║                 [30 bis 79].                                        ║
  1994.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  1995.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  1996.        ║                 Darstellung im Schwarz/Weiß-Modus.                  ║
  1997.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  1998.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  1999.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2000.        ║                 Bit 7    : blinken                                  ║
  2001.        ╟─────────────────────────────────────────────────────────────────────╢
  2002.        ║Subroutinen:     AREADZ,AWRI,UPCASE                                  ║
  2003.        ╟─────────────────────────────────────────────────────────────────────╢
  2004.        ║Beispiel:        CHARACTER STRING*10                                 ║
  2005.        ║                 CALL OPTION (STRING,8,10,15,70,23)                  ║
  2006.        ║                 In den String können die Zeichen "A" bis "I" oder   ║
  2007.        ║                 "a" bis "i" als Auswahlkriterien für 8 bereits am   ║
  2008.        ║                 Bildschirm vorhandene Optionstexte angegeben werden.║
  2009.        ║                 Der Hinweistext wird in Zeile 10 ab Spalte 15 in    ║
  2010.        ║                 hellgrauer Farbe auf blauem Hintergrund ausgegeben. ║
  2011.        ║                 In der gleichen Zeile ab Spalte 70 werden die       ║
  2012.        ║                 Auswahlkriterien eingelesen.                        ║
  2013.        ╚═════════════════════════════════════════════════════════════════════╝
  2014.     
  2015.  
  2016.                                                                       Seite 44
  2017.  
  2018.  
  2019.        ╔═════════════════════════════════════════════════════════════════════╗
  2020.        ║Beschreibung der Subroutine FRAG (ANT,TEXT,ANZ,ZEI,SP,RSP,COL)       ║
  2021.        ║Die Subroutine schreibt eine Frage positioniert auf den Bildschirm   ║
  2022.        ║und ließt die Antwort "j" oder "n" bzw. "J" oder "N" in eine         ║
  2023.        ║Antwortvariable "ANT" ein. Der String "  <J/N>" wird an den Fragetext║
  2024.        ║angehängt.                                                           ║
  2025.        ╟─────────────────────────────────────────────────────────────────────╢
  2026.        ║Parameter:                                                           ║
  2027.        ║CHARACTER        Antwortvariable [1 Zeichen]; Es sind die Zeichen    ║
  2028.        ║                 "J", "N", "j", und "n" zugelassen.                  ║
  2029.        ║CHARACTERSTRING  Fragetext [max. 72 Zeichen ]; hinter dem letzten    ║
  2030.        ║                 zu schreibenden Zeichen kann ein Null-Character als ║
  2031.        ║                 Terminator angefügt werden.                         ║
  2032.        ║INTEGER          Anzahl der zu schreibenden Zeichen. Es werden       ║
  2033.        ║                 soviele Zeichen geschrieben, bis entweder die Anzahl║
  2034.        ║                 erreicht ist oder ein Null-Character gefunden wird  ║
  2035.        ║                 oder die 79. Spalte beschrieben wurde.              ║
  2036.        ║INTEGER          Zeile in die die Frage geschrieben werden soll. Der ║
  2037.        ║                 Wert darf zwischen 1 und 25 liegen.                 ║
  2038.        ║INTEGER          Spalte ab der die Frage geschrieben werden soll. Der║
  2039.        ║                 Wert darf zwischen 1 und 79 liegen.                 ║
  2040.        ║INTEGER          Spalte aus der die Antwort gelesen werden soll. Der ║
  2041.        ║                 Wert darf zwischen 1 und 79 liegen.                 ║
  2042.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  2043.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2044.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  2045.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2046.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  2047.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2048.        ║                 Bit 7    : blinken                                  ║
  2049.        ╟─────────────────────────────────────────────────────────────────────╢
  2050.        ║Subroutinen:     AREADZ,AWRI,LAENGE,UPCASE                           ║
  2051.        ╟─────────────────────────────────────────────────────────────────────╢
  2052.        ║Beispiel:        CHARACTER ANT*1                                     ║
  2053.        ║                 CALL FRAG (ANT,'Noch einmal?',12,10,20,50,23)       ║
  2054.        ║                 Die Frage wird in der 10. Zeile ab der 20. Spalte   ║
  2055.        ║                 mit hellgrauer Farbe auf blauem Hintergrund auf den ║
  2056.        ║                 Bildschirm geschrieben. Die Antwort wird aus der 50.║
  2057.        ║                 Spalte in die Variable "ANT" gelesen.               ║
  2058.        ╚═════════════════════════════════════════════════════════════════════╝
  2059.     
  2060.  
  2061.                                                                       Seite 45
  2062.  
  2063.  
  2064.        ╔═════════════════════════════════════════════════════════════════════╗
  2065.        ║Beschreibung der Subroutine ZIFRAG (ANT,TEXT,ANZ,ZEI,SP,RSP,COL)     ║
  2066.        ║Die Subroutine gibt einen Fragetext der Länge ANZ positioniert auf   ║
  2067.        ║den Bildschirm aus und liest in eine Integervariable eine der        ║
  2068.        ║zugelassenen Ziffern 0 bis 9 als Antwort ein.                        ║
  2069.        ╟─────────────────────────────────────────────────────────────────────╢
  2070.        ║Parameter:                                                           ║
  2071.        ║INTEGER          Return: Eine der Ziffern 0 bis 9 als Antwort.       ║
  2072.        ║CHARACTERSTRING  Fragetext [1 bis 80 Characters].                    ║
  2073.        ║INTEGER          Anzahl der Zeichen im Fragetext.                    ║
  2074.        ║INTEGER          Zeile in der der Fragetext geschrieben werden soll  ║
  2075.        ║                 und aus der die Antwort gelesen werden soll         ║
  2076.        ║                 [1 bis 25].                                         ║
  2077.        ║INTEGER          Spalte, ab der der Fragetext geschrieben werden     ║
  2078.        ║                 soll [1 bis 79].                                    ║
  2079.        ║INTEGER          Spalte, aus der die Antwort gelesen werden soll     ║
  2080.        ║                 [1 bis 79].                                         ║
  2081.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  2082.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2083.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  2084.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2085.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  2086.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2087.        ║                 Bit 7    : blinken                                  ║
  2088.        ╟─────────────────────────────────────────────────────────────────────╢
  2089.        ║Subroutinen:     AWRI,IREAD                                          ║
  2090.        ╟─────────────────────────────────────────────────────────────────────╢
  2091.        ║Beispiel:        CALL ZIFRAG (I,'Anzahl?',7,10,20,40,23)             ║
  2092.        ║                 Der Fragetext wird in hellgrauer Farbe auf blauem   ║
  2093.        ║                 Hintergrund in der 10. Zeile ab Spalte 20           ║
  2094.        ║                 geschrieben. Die Antwortziffer wird aus Spalte 40   ║
  2095.        ║                 gelesen.                                            ║
  2096.        ╚═════════════════════════════════════════════════════════════════════╝
  2097.     
  2098.  
  2099.                                                                       Seite 46
  2100.  
  2101.  
  2102.        Bildschirmmasken
  2103.  
  2104.        Bildschirmmasken ermöglichen das Einlesen von Daten beliebigen Formats
  2105.        in einer vorgegebenen Form.  Die Datenfelder einer Bildschirmmaske
  2106.        werden gewöhnlich in der im Formular vorgegebenen Reihenfolge und Form
  2107.        auf dem Bildschirm angeordnet.  Dabei kann die Form des Formulars mit
  2108.        Hilfe der Maske am Bildschirm mehr oder weniger originalgetreu
  2109.        nachgebildet werden.  Es besteht die Möglichkeit, die Datentypen
  2110.        INTEGER, REAL und CHARACTER sowie ein spezielles Datumsformat in der
  2111.        Bildschirmmaske zu verwenden.  Selbstverständlich werden die
  2112.        entsprechenden Plausibilitätskontrollen direkt während der Dateneingabe
  2113.        vorgenommen.  Innerhalb der Bildschirmmaske ist das Springen zwischen
  2114.        den Datenfeldern mit den Tasten des Cursorblocks möglich.  Eine Maske
  2115.        wird mit der <Escape>-Taste abgeschlossen.  In Verbindung mit
  2116.        Subroutinen aus dem Kapitel "Fenstertechnik" ist sogar das Vorwärts- und
  2117.        Rückwärtsblättern zwischen den mit Hilfe von Bildschirmmasken
  2118.        ausgefüllten elektronisch gespeicherten Seiten möglich.
  2119.  
  2120.  
  2121.        Subroutinen zur Maskengenerierung
  2122.  
  2123.        MASTXT  a) Text aus einer direct organisierten Datei in Form einer
  2124.                   Bildschirmmaske auf dem Bildschirm positionieren
  2125.        MASK    a) Bildschirmmaske zum Einlesen von Strings, Integerwerten,
  2126.                   Realwerten und Datumsformaten generieren
  2127.                b) Bildschirmmaske zum Korrigieren von Strings, Integerwerten,
  2128.                   Realwerten und Datumsformaten generieren
  2129.        TXMASK  a) Bildschirmmaske zum Einlesen von Strings generieren
  2130.                b) Bildschirmmaske zum Korrigieren von Strings generieren
  2131.     
  2132.  
  2133.                                                                       Seite 47
  2134.  
  2135.  
  2136.        ╔═════════════════════════════════════════════════════════════════════╗
  2137.        ║Beschreibung der Subroutine MASTXT (ANZ,LAN,ZEI,SP,UNIT,SNR,COL)     ║
  2138.        ║Die Subroutine liest aus einer direkt organisierten Datei Texte und  ║
  2139.        ║bringt diese positioniert auf den Bildschirm. Die Routine dient      ║
  2140.        ║zur Vorbereitung des Maskenfeldes für die Subroutine MASK.           ║
  2141.        ║Löschfenster und Rahmen müssen, falls erforderlich, bereits vorhanden║
  2142.        ║sein.                                                                ║
  2143.        ╟─────────────────────────────────────────────────────────────────────╢
  2144.        ║Parameter:                                                           ║
  2145.        ║INTEGER          Anzahl der zur benötigten Maskentexte.              ║
  2146.        ║INTEGER          Feld mit Längen der zu schreibenden Maskentexte     ║
  2147.        ║                 [1 bis 78].                                         ║
  2148.        ║INTEGER          Feld mit Zeilen in denen die Maskentexte geschrieben║
  2149.        ║                 geschrieben werden sollen [1 bis 25]                ║
  2150.        ║INTEGER          Feld mit Spalten, in denen die Maskentexte beginnen ║
  2151.        ║                 sollen [1 bis 79]                                   ║
  2152.        ║INTEGER          Unit der direkt organisierten Datei, aus der die    ║
  2153.        ║                 Maskentexte gelesen werden sollen.                  ║
  2154.        ║INTEGER          Satznummer des ersten Maskentextes in der direkt    ║
  2155.        ║                 organisierten Datei.                                ║
  2156.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  2157.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2158.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  2159.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2160.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  2161.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2162.        ║                 Bit 7    : blinken                                  ║
  2163.        ╟─────────────────────────────────────────────────────────────────────╢
  2164.        ║Subroutinen:     AWRI                                                ║
  2165.        ╟─────────────────────────────────────────────────────────────────────╢
  2166.        ║Beispiel:        INTEGER LAN(6),ZEI(6),SP(6)                         ║
  2167.        ║                 DATA ZEI /3,5,7,9,11,13/, SP /4,9,35,2,4,40/        ║
  2168.        ║                 DATA LAN /10,15,18,9,25,60/                         ║
  2169.        ║Beispiel:        CALL MASTXT (6,LAN,ZEI,SP,10,200,23)                ║
  2170.        ║                 Die Subroutine liest aus der Datei mit dem Unit 10  ║
  2171.        ║                 sechs Zeilen Text ab der Recordnummer 200.          ║
  2172.        ║                 Die Texte werden mit den Zeilen- und Spaltenangaben ║
  2173.        ║                 aus den Feldern ZEI und SP positioniert auf den     ║
  2174.        ║                 Bildschirm gebracht. Die Farbe der Texte ist        ║
  2175.        ║                 hellgrau auf blauem Hintergrund.                    ║
  2176.        ╚═════════════════════════════════════════════════════════════════════╝
  2177.     
  2178.  
  2179.                                                                       Seite 48
  2180.  
  2181.  
  2182.        ╔═════════════════════════════════════════════════════════════════════╗
  2183.        ║Beschreibung der Subroutine                                          ║
  2184.        ║MASK (ART,ADDR,FORM,ZEI,SP,AUF,AB,KON,ANZ,MZEI,MSP,COL,FLAG)         ║
  2185.        ║Die Subroutine stellt auf dem Bildschirm positionierte Felder der    ║
  2186.        ║verschiedenen Datentypen in Form einer Maske zur Verfügung. Es ist   ║
  2187.        ║möglich Texte, Integer- und Realwerte und Datumsformate einzulesen   ║
  2188.        ║und/oder cursorgesteuert zu ändern. Mit Hilfe der Cursor- und        ║
  2189.        ║Tabulatortasten und der Bild-aufwärts und Bild-abwärts-Tasten wird   ║
  2190.        ║das Springen zwischen den Feldern der Maske möglich. Zum Beenden der ║
  2191.        ║Maskeneingabe können wahlweise die Tasten Bild-aufwärts und Bild-    ║
  2192.        ║abwärts, die Escape-Taste oder die Funktionstasten 1 bis 10 gewählt  ║
  2193.        ║werden. In der "MZEI" ab der Spalte "MSP" werden dem Benutzer die zur║
  2194.        ║Verfügung stehenden Tasten erklärt. Zum Beschreiben und Ändern der   ║
  2195.        ║Maskenfelder können alle Tasten des Cursorblocks benutzt werden.     ║
  2196.        ╟─────────────────────────────────────────────────────────────────────╢
  2197.        ║Parameter:                                                           ║
  2198.        ║INTEGERFELD      Feld mit Kennziffern für das Datenformat der zur    ║
  2199.        ║                 Verwendung kommenden Maskenfelder [ ART(ANZ) ].     ║
  2200.        ║                 1: Integer                                          ║
  2201.        ║                 2: Real                                             ║
  2202.        ║                 3: Characterstring                                  ║
  2203.        ║                 4: Datumsformat                                     ║
  2204.        ║                 Beim Datumsformat wird ein Datum als Integervariable║
  2205.        ║                 der Form JJJJMMTT übergeben und zurückgegeben. Die  ║
  2206.        ║                 Bildschirmdarstellung erfolgt in der Form           ║
  2207.        ║                 TT.MM.JJJJ. Es werden nur plausible Daten           ║
  2208.        ║                 übernommen. Integer- und Realwerte werden am        ║
  2209.        ║                 Bildschirm mit führenden Nullen dargestellt. Der    ║
  2210.        ║                 Dezimalpunkt in der Realdarstellung dient zur       ║
  2211.        ║                 Kennzeichnug des Real-Formates.                     ║
  2212.        ║INTEGERFELD      Feld mit Maschinenadressen der zu den Maskenfeldern ║
  2213.        ║                 gehörenden Variablen [ ADDR(ANZ) ].                 ║
  2214.        ║                 Die Adressen werden mit der Integer-Funktion LOC    ║
  2215.        ║                 ermittelt [ z.B.: ADDR(1)=LOC(Variable) ].          ║
  2216.        ║INTEGERFELD      Feld mit Formatangaben der aus den Maskenfeldern    ║
  2217.        ║                 zu lesenden oder zu korrigierenden Werte            ║
  2218.        ║                 [ FORM(ANZ) ].                                      ║
  2219.        ║                 Integer:   1 bis 11                                 ║
  2220.        ║                 Real:      10 bis 209                               ║
  2221.        ║                            (Fortran-Format mit 10 multipliziert,    ║
  2222.        ║                            z.B. 104 entspricht 5 Vorkommastellen    ║
  2223.        ║                          - und 4 Nachkommastellen).                 ║
  2224.        ║                 Character: 1 bis 79                                 ║
  2225.        ║                 Datum:     Wert ohne Bedeutung, da die Feldlänge    ║
  2226.        ║                            automatisch immer 10 ist.                ║
  2227.        ║INTEGERFELD      Feld mit Zeilen, in denen sich die jeweiligen       ║
  2228.        ║                 Maskenfelder befinden [ ZEI(ANZ) ].                 ║
  2229.        ║                 Die Zeilennummern dürfen zwischen 1 und 24 liegen,  ║
  2230.        ║                 es ist aber zu beachten, daß in Zeile 24 der        ║
  2231.        ║                 Hinweistext über die Tastenbelegung erscheint.      ║
  2232.        ║INTEGERFELD      Feld mit Spalten, in denen die jeweiligen Masken-   ║
  2233.        ║                 felder beginnen [ SP(ANZ) ].                        ║
  2234.        ║                 Die Spaltennummern dürfen zwischen 1 und 79 liegen. ║
  2235.        ║INTEGERFELD      Feld mit Nummern der Maskenfelder, die angesprungen ║
  2236.        ║                 werden, wenn das Maskenfeld mit der Cursor-aufwärts-║
  2237.     
  2238.  
  2239.                                                                       Seite 49
  2240.  
  2241.  
  2242.        ║                 Taste verlassen wird. [ AUF(ANZ) ].                 ║
  2243.        ║INTEGERFELD      Feld mit Nummern der Maskenfelder, die angesprungen ║
  2244.        ║                 werden, wenn das Maskenfeld mit der Cursor-abwärts- ║
  2245.        ║                 Taste verlassen wird. [ AB(ANZ) ].                  ║
  2246.        ║INTEGERFELD      Feld mit Flags, die angeben, ob ein Wert neu        ║
  2247.        ║                 eingelesen oder korrigiert werden soll.             ║
  2248.        ║                 0: Wert einlesen                                    ║
  2249.        ║                 1: Wert korrigieren                                 ║
  2250.        ║                 Return: Feld mit Flags, die angeben, ob das Werte-  ║
  2251.        ║                 feld leer ist, oder ob ein Wert übernommen wurde.   ║
  2252.        ║                 0: kein Wert im Wertefeld                           ║
  2253.        ║                 1: Wert übernommen                                  ║
  2254.        ║INTEGER          Anzahl der Maskenfelder.                            ║
  2255.        ║INTEGER          Zeile in der die Tastenbelegung für die Beendigung  ║
  2256.        ║                 der Maske beschrieben wird oder Null, wenn keine    ║
  2257.        ║                 Meldung ausgegeben werden soll. Die Meldung ist 54  ║
  2258.        ║                 Zeichen lang, wenn "FLAG" größer/gleich 1024 ist,   ║
  2259.        ║                 sonst nur 49 Zeichen.                               ║
  2260.        ║INTEGER          Spalte ab der die Tastenbelegung für die Beendigung ║
  2261.        ║                 der Maske beschrieben wird oder Null, wenn keine    ║
  2262.        ║                 Meldung ausgegeben werden soll oder 100, wenn die   ║
  2263.        ║                 Meldung mittenzentriert ausgegeben werden soll. Die ║
  2264.        ║                 Meldung ist 54 Zeichen lang, wenn "FLAG" größer/    ║
  2265.        ║                 gleich 1024 ist, sonst nur 49 Zeichen.              ║
  2266.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  2267.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2268.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  2269.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2270.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  2271.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2272.        ║                 Bit 7    : blinken                                  ║
  2273.        ║INTEGER          Bitmuster für Abschlußtasten zum Beenden der        ║
  2274.        ║                 Eingabe bzw. Korrektur in einer Maske:              ║
  2275.        ║                     32: <Bild-aufwärts>-Taste                       ║
  2276.        ║                     64: <Bild-abwärts>-Taste                        ║
  2277.        ║                    512: <Escape>-Taste                              ║
  2278.        ║                   1024: <F1>-Taste                                  ║
  2279.        ║                   2048: <F2>-Taste                                  ║
  2280.        ║                   4096: <F3>-Taste                                  ║
  2281.        ║                   8192: <F4>-Taste                                  ║
  2282.        ║                  16384: <F5>-Taste                                  ║
  2283.        ║                  32768: <F6>-Taste                                  ║
  2284.        ║                  65536: <F7>-Taste                                  ║
  2285.        ║                 131072: <F8>-Taste                                  ║
  2286.        ║                 262144: <F9>-Taste                                  ║
  2287.        ║                 524288: <F10>-Taste                                 ║
  2288.        ║                 Die Abschlußtasten können durch Addition miteinander║
  2289.        ║                 verknüpft werden. Wenn die Bild-aufwärts- und       ║
  2290.        ║                 Bild-abwärts-Tasten nicht gewählt sind, wird bei    ║
  2291.        ║                 deren Benutzung zum ersten bzw. letzten Maskenfeld  ║
  2292.        ║                 gesprungen.                                         ║
  2293.        ║                 Return: Bitmuster der Abschlußtaste                 ║
  2294.        ╟─────────────────────────────────────────────────────────────────────╢
  2295.        ║Subroutinen:     ADRESS,AREAD,AWRI,DREAD,IREAD,LAENGE,PEEK,POKE,RREAD║
  2296.        ╟─────────────────────────────────────────────────────────────────────╢
  2297.     
  2298.  
  2299.                                                                       Seite 50
  2300.  
  2301.  
  2302.        ║Beispiel:        INTEGER ADDR(4),ART(4),FORM(4),ZEI(4),SP(4),AUF(4), ║
  2303.        ║                -AB(4),KON(4),IWERT,DATUM                            ║
  2304.        ║                 REAL RWERT                                          ║
  2305.        ║                 CHARACTER TEXT*30                                   ║
  2306.        ║                 DATA ART /1,2,3,4/, FORM /5,84,30,0/                ║
  2307.        ║                 DATA ZEI /3,3,4,4/, SP /5,40,5,40/                  ║
  2308.        ║                 DATA AUF /0,3,1,2/, AB /3,4,2,0/                    ║
  2309.        ║                 DATA KON /0,0,0,0/                                  ║
  2310.        ║                 ADDR(1)=LOC(IWERT)                                  ║
  2311.        ║                 ADDR(2)=LOC(RWERT)                                  ║
  2312.        ║                 ADDR(3)=LOC(TEXT)                                   ║
  2313.        ║                 ADDR(4)=LOC(DATUM)                                  ║
  2314.        ║                 CALL MASK                                           ║
  2315.        ║                -(ART,ADDR,FORM,ZEI,SP,AUF,AB,KON,4,24,15,23,608)    ║
  2316.        ║                 In den Zeilen 3 und 4 wird eine Bildschirmmaske     ║
  2317.        ║                 zur Verfügung gestellt, die es ermöglicht je einen  ║
  2318.        ║                 Integer- und Realwert, einen Text und einen Datums- ║
  2319.        ║                 string zu bearbeiten. In Zeile 24 werden die zur    ║
  2320.        ║                 Verfügung stehenden Tasten erklärt. Die Maske kann  ║
  2321.        ║                 durch die Escapetaste und durch die Bild-aufwärts-  ║
  2322.        ║                 und Bild-abwärts-Tasten abgeschlossen werden. Die   ║
  2323.        ║                 eingegebenen Werte werden mit hellgrauer Farbe auf  ║
  2324.        ║                 blauem Hintergrund dargestellt.                     ║
  2325.        ╚═════════════════════════════════════════════════════════════════════╝
  2326.     
  2327.  
  2328.                                                                       Seite 51
  2329.  
  2330.  
  2331.        ╔═════════════════════════════════════════════════════════════════════╗
  2332.        ║Beschreibung der Subroutine                                          ║
  2333.        ║TXMASK (FELD,LAN,ZEI,SP,AUF,AB,KON,ANZ,MZEI,MSP,COL,FLAG)            ║
  2334.        ║Die Subroutine stellt auf dem Bildschirm positionierte Felder des    ║
  2335.        ║Datentyps CHARACTER in Form einer Maske zur Verfügung. Es ist        ║
  2336.        ║möglich, Texte einzulesen und/oder cursorgesteuert zu ändern. Mit    ║
  2337.        ║Hilfe der Cursor- und Tabulatortasten und der Bild-aufwärts und      ║
  2338.        ║Bild-abwärts-Tasten wird das Springen zwischen den Feldern der Maske ║
  2339.        ║möglich. Zum Beenden der Maskeneingabe können wahlweise die Tasten   ║
  2340.        ║Bild-aufwärts und Bild-abwärts, die Escape-Taste oder die            ║
  2341.        ║Funktionstasten 1 bis 5 gewählt werden. In der Zeile "MZEI" ab der   ║
  2342.        ║Spalte "MSP" werden dem Benutzer die zur Verfügung stehenden Tastenn ║
  2343.        ║erklärt. Zum Beschreiben und Ändern der Maskenfelder können alle     ║
  2344.        ║Tasten des Cursorblocks benutzt werden.                              ║
  2345.        ╟─────────────────────────────────────────────────────────────────────╢
  2346.        ║Parameter:                                                           ║
  2347.        ║CHARACTERFELD    Feld für einzulesende oder zu ändernde Texte.       ║
  2348.        ║                 Return: Eingelesene bzw. geänderte Texte.           ║
  2349.        ║                 [ FELD(ANZ)*(*) ].                                  ║
  2350.        ║INTEGERFELD      Feld mit Längenangaben der aus den Maskenfeldern    ║
  2351.        ║                 zu lesenden oder zu korrigierenden Texte.           ║
  2352.        ║                 [ LAN(ANZ) ]  (1 bis 79)                            ║
  2353.        ║INTEGERFELD      Feld mit Zeilen, in denen sich die jeweiligen       ║
  2354.        ║                 Maskenfelder befinden [ ZEI(ANZ) ].                 ║
  2355.        ║                 Die Zeilennummern dürfen zwischen 1 und 24 liegen,  ║
  2356.        ║                 es ist aber zu beachten, daß in Zeile 24 der        ║
  2357.        ║                 Hinweistext über die Tastenbelegung erscheint.      ║
  2358.        ║INTEGERFELD      Feld mit Spalten, in denen die jeweiligen Masken-   ║
  2359.        ║                 felder beginnen [ SP(ANZ) ].                        ║
  2360.        ║                 Die Spaltennummern dürfen zwischen 1 und 79 liegen. ║
  2361.        ║INTEGERFELD      Feld mit Nummern der Maskenfelder, die angesprungen ║
  2362.        ║                 werden, wenn das Maskenfeld mit der Cursor-aufwärts-║
  2363.        ║                 Taste verlassen wird. [ AUF(ANZ) ].                 ║
  2364.        ║INTEGERFELD      Feld mit Nummern der Maskenfelder, die angesprungen ║
  2365.        ║                 werden, wenn das Maskenfeld mit der Cursor-abwärts- ║
  2366.        ║                 Taste verlassen wird. [ AB(ANZ) ].                  ║
  2367.        ║INTEGERFELD      Feld mit Flags, die angeben, ob ein Text neu        ║
  2368.        ║                 eingelesen oder korrigiert werden soll.             ║
  2369.        ║                 0: Text einlesen                                    ║
  2370.        ║                 1: Text korrigieren                                 ║
  2371.        ║                 Return: Feld mit Flags, die angeben, ob das Masken- ║
  2372.        ║                 feld leer ist, oder ob ein Text übernommen wurde.   ║
  2373.        ║                 0: kein Wert im Maskenfeld                          ║
  2374.        ║                 1: Text übernommen                                  ║
  2375.        ║INTEGER          Anzahl der Maskenfelder.                            ║
  2376.        ║INTEGER          Zeile in der die Tastenbelegung für die Beendigung  ║
  2377.        ║                 der Maske beschrieben wird oder Null, wenn keine    ║
  2378.        ║                 Meldung ausgegeben werden soll. Die Meldung ist 54  ║
  2379.        ║                 Zeichen lang, wenn "FLAG" größer/gleich 1024 ist,   ║
  2380.        ║                 sonst nur 49 Zeichen.                               ║
  2381.        ║INTEGER          Spalte ab der die Tastenbelegung für die Beendigung ║
  2382.        ║                 der Maske beschrieben wird oder Null, wenn keine    ║
  2383.        ║                 Meldung ausgegeben werden soll oder 100, wenn die   ║
  2384.        ║                 Meldung mittenzentriert ausgegeben werden soll. Die ║
  2385.        ║                 Meldung ist 54 Zeichen lang, wenn "FLAG" größer/    ║
  2386.     
  2387.  
  2388.                                                                       Seite 52
  2389.  
  2390.  
  2391.        ║                 gleich 1024 ist, sonst nur 49 Zeichen.              ║
  2392.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  2393.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2394.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  2395.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2396.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  2397.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2398.        ║                 Bit 7    : blinken                                  ║
  2399.        ║INTEGER          Bitmuster für Abschlußtasten zum Beenden der        ║
  2400.        ║                 Eingabe bzw. Korrektur in einer Maske:              ║
  2401.        ║                    32: <Bild-aufwärts>-Taste                        ║
  2402.        ║                    64: <Bild-abwärts>-Taste                         ║
  2403.        ║                   512: <Escape>-Taste                               ║
  2404.        ║                  1024: <F1>-Taste                                   ║
  2405.        ║                  2048: <F2>-Taste                                   ║
  2406.        ║                  4096: <F3>-Taste                                   ║
  2407.        ║                  8192: <F4>-Taste                                   ║
  2408.        ║                 16384: <F5>-Taste                                   ║
  2409.        ║                 Die Abschlußtasten können durch Addition miteinander║
  2410.        ║                 verknüpft werden. Wenn die Bild-aufwärts- und       ║
  2411.        ║                 Bild-abwärts-Tasten nicht gewählt sind, wird bei    ║
  2412.        ║                 deren Benutzung zum ersten bzw. letzten Maskenfeld  ║
  2413.        ║                 gesprungen.                                         ║
  2414.        ║                 Return: Bitmuster der Abschlußtaste                 ║
  2415.        ╟─────────────────────────────────────────────────────────────────────╢
  2416.        ║Subroutinen:     AREAD,AWRI,LAENGE                                   ║
  2417.        ╟─────────────────────────────────────────────────────────────────────╢
  2418.        ║Beispiel:        INTEGER LAN(4),ZEI(4),SP(4),AUF(4),AB(4),KON(4)     ║
  2419.        ║                 CHARACTER TEXT(4)*30                                ║
  2420.        ║                 DATA LAN /30,20,8,10/, ZEI /3,3,4,4/, SP /5,40,5,40/║
  2421.        ║                 DATA AUF /0,3,1,2/, AB /3,4,2,0/, KON /4*0/         ║
  2422.        ║                 CALL TXMASK                                         ║
  2423.        ║                -(TEXT,LAN,ZEI,SP,AUF,AB,KON,4,24,15,23,608)         ║
  2424.        ║                 In den Zeilen 3 und 4 wird eine Bildschirmmaske     ║
  2425.        ║                 zur Verfügung gestellt, die das Einlesen von vier   ║
  2426.        ║                 Textstrings erlaubt. In Zeile 24 werden die zur     ║
  2427.        ║                 Verfügung stehenden Tasten erklärt. Die Maske kann  ║
  2428.        ║                 durch die Escapetaste und durch die Bild-aufwärts-  ║
  2429.        ║                 und Bild-abwärts-Tasten abgeschlossen werden. Die   ║
  2430.        ║                 eingegebenen Werte werden mit hellgrauer Farbe auf  ║
  2431.        ║                 blauem Hintergrund dargestellt.                     ║
  2432.        ╚═════════════════════════════════════════════════════════════════════╝
  2433.     
  2434.  
  2435.                                                                       Seite 53
  2436.  
  2437.  
  2438.        Fenstertechnik
  2439.  
  2440.        Mit Fenstertechnik wird ein Verfahren bezeichnet, das es ermöglicht,
  2441.        Aktionen am Bildschirm mit Hilfe verschiedener Fenster durchzuführen,
  2442.        die im Arbeitspeicher vorgehalten werden können und so für spätere
  2443.        Aktionen zur Verfügung stehen.  Mit den in FORSUB.LIB enthaltenen
  2444.        Subroutinen zur hirachischen Fenstertechnik können Menüs, Texte und
  2445.        Datenfelder erzeugt, verwaltet und gespeichert werden.
  2446.  
  2447.        Die Subroutinen allokieren automatisch den für die Fenster benötigten
  2448.        Speicherbereich im Arbeitspeicher.  Wenn im Arbeitsspeicher nicht mehr
  2449.        genügend Speicherplatz vorhanden ist, wird eine temporäre, direct
  2450.        organisierte Datei eröffnet.  Die dort abgelegten Fenster stehen
  2451.        unabhängig von der Größe des noch freien Arbeitsspeichers zur Verfügung.
  2452.  
  2453.        Jeweils bis zu dreißig Bildschirmfenster können mit Hilfe eines
  2454.        Verwaltungsfeldes verwaltet werden.  Jede Fensterroutine benötigt eine
  2455.        Nummer zwischen eins und dreißig für das Fenster und die Adresse des
  2456.        Verwaltungsfeldes.  Die Adresse des Verwaltungsfeldes wird automatisch
  2457.        ermittelt, wenn beim Ablegen eines Bildschirmfensters in den
  2458.        Arbeitsspeicher noch keine Adresse für das Verwaltungsfeld vorhanden
  2459.        ist.  Es wird von den Fensterroutinen jeweils aktualisiert.  Der
  2460.        Programmierer muß sich nicht mit dem Verwaltungsfeld aufhalten, da alle
  2461.        Aktualisierungen absolut im Hintergrund ablaufen.  Selbstverständlich
  2462.        ist es möglich, mehrere Verwaltungsfelder zu erzeugen und so mehr als
  2463.        dreißig Bildschirmfenster zu speichern.
  2464.  
  2465.        Die Nummer des Bildschirmfensters gibt die Priorität an, mit der es am
  2466.        Bildschirm dargestellt wird.  Fenster mit höheren Fensternummern
  2467.        überdecken Fenster mit niedrigeren Fensternummern.  Viele Subroutinen
  2468.        stellen das gerade zu bearbeitende Fenster vorübergehend mit der
  2469.        höchsten Priorität am Bildschirm dar, um es nach Abschluß der
  2470.        Bearbeitung an die ursprüngliche Position zurückzustellen.
  2471.  
  2472.  
  2473.        Subroutinen zur Fenstertechnik
  2474.  
  2475.        PUTFEN  a) Bildschirmausschnitt als Fenster im Arbeitsspeicher ablegen
  2476.        MAKFEN  a) Characterfeld als Fenster im Arbeitsspeicher ablegen
  2477.        TEXFEN  a) Text aus einer direct organisierten Datei als Fenster im
  2478.                   Arbeitsspeicher ablegen
  2479.                b) Text aus einer direct organisierten Datei mehrspaltig in
  2480.                   einem Fenster ablegen
  2481.        GETFEN  a) Fenster aus dem Arbeitsspeicher holen und auf dem Bildschirm
  2482.                   positionieren
  2483.        PRIFEN  a) Priorität zweier Bildschirmfenster austauschen
  2484.        MOVFEN  a) Fenster mit Hilfe der Cursortasten über den Bildschirm
  2485.                   bewegen
  2486.        MOPFEN  a) Position eines Fensters auf dem Bildschirm verändern
  2487.        GROFEN  a) Größe eines Fensters mit Hilfe der Cursortasten verändern
  2488.        GRPFEN  a) Größe eines Fensters auf dem Bildschirm verändern
  2489.        LOSFEN  a) Inhalt eines Fensters löschen
  2490.        RAMFEN  a) Fenster umrahmen und im oberen und unteren Rahmenteil mit
  2491.                   Meldungen versehen
  2492.        WRIFEN  a) Fenster von der Tastatur aus mit Text beschreiben
  2493.     
  2494.  
  2495.                                                                       Seite 54
  2496.  
  2497.  
  2498.        ME1FEN  a) Einfache Menüauswahl in einem Fenster
  2499.        MEMFEN  a) Mehrfache Menüauswahl in einem Fenster
  2500.        VERFEN  a) Mehrere Fenster mit Hilfe eines Verwaltungsfensters am
  2501.                   Bildschirm verwalten
  2502.        CLOFEN  a) Fenster vom Bildschirm entfernen
  2503.        FREFEN  a) Fenster aus dem Arbeitsspeicher entfernen
  2504.        INFFEN  a) Informationen über ein Fenster abfragen
  2505.     
  2506.  
  2507.                                                                       Seite 55
  2508.  
  2509.  
  2510.        ╔═════════════════════════════════════════════════════════════════════╗
  2511.        ║Beschreibung der Subroutine PUTFEN (NR,H,B,ZEI,SP,VSEG,FLAG)         ║
  2512.        ║Die Subroutine kopiert ein definiertes Fenster vom Bildschirm in die ║
  2513.        ║Memory. Wenn keine Memory mehr verfügbar ist, wird das Bildschirm-   ║
  2514.        ║fenster in einer temporären Datei abgelegt. Informationen über die   ║
  2515.        ║Ausmaße des Bildschirmfensters und über die Adresse an der es        ║
  2516.        ║gespeichert ist, werden automatisch in einem Verwaltungsfeld, das    ║
  2517.        ║sich ebenfalls in der Memory befindet, abgelegt. Das Verwaltungsfeld ║
  2518.        ║wird angelegt, wenn in der Variablen "VSEG" eine Null an die         ║
  2519.        ║Subroutine übergeben wird. In "VSEG" wird die Adresse des            ║
  2520.        ║Verwaltungsfeldes an das rufende Programm zurückgegeben. Sie wird    ║
  2521.        ║für alle zukünftigen Zugriffe auf Fenster mit Hilfe der Fenster-     ║
  2522.        ║routinen benötigt. Die Nummer des abzulegenden Bildschirmfensters    ║
  2523.        ║wird in der Variablen "NR" übergeben. Sie kann zum Aufbau einer      ║
  2524.        ║hirarchischen Struktur der Bildschirmfenster benutzt werden. Es      ║
  2525.        ║können mehrere Verwaltungsfelder nebeneinander benutzt werden, so daß║
  2526.        ║insgesamt mehr als 30 Bildschirmfenster in der Memory bzw. in einem  ║
  2527.        ║temporären File abgelegt werden können. Wenn diese Subroutine von    ║
  2528.        ║einem Programm genutzt wird, darf keine Datei mit dem Unit 100       ║
  2529.        ║eröffnet werden, da das Unit für die temporäre Datei benötigt wird.  ║
  2530.        ║Bei erfolgreicher Beendigung der Subroutine steht in "FLAG" eine     ║
  2531.        ║Null, sonst eine Eins.                                               ║
  2532.        ╟─────────────────────────────────────────────────────────────────────╢
  2533.        ║Parameter:                                                           ║
  2534.        ║INTEGER          Nummer des in der Memory abzulegenden Bildschirm-   ║
  2535.        ║                 fensters [ 1 bis 30 ]. Wenn die Nummer schon        ║
  2536.        ║                 durch ein anderes Bildschirmfenster belegt ist,     ║
  2537.        ║                 wird die Routine mit "FLAG" gleich Eins abgebrochen.║
  2538.        ║                 Durch die Nummer wird die Hirarchie der Bildschirm- ║
  2539.        ║                 fenster festgelegt.                                 ║
  2540.        ║INTEGER          Höhe des Bildschirmfensters in Zeilen [ 1 bis 25 ]. ║
  2541.        ║INTEGER          Breite des Bildschirmfensters in Spalten            ║
  2542.        ║                 [ 1 bis 80 ].                                       ║
  2543.        ║INTEGER          Zeile in der das Bildschirmfenster beginnt          ║
  2544.        ║                 [ 1 bis 25 ].                                       ║
  2545.        ║INTEGER          Spalte, in der das Bildschirmfenster beginnt        ║
  2546.        ║                 [ 1 bis 80 ].                                       ║
  2547.        ║INTEGER          Zum Anlegen des Verwaltungsfeldes wird eine Null    ║
  2548.        ║                 an die Routine übergeben.                           ║
  2549.        ║                 Return: Adresse des Verwaltungsfeldes. Sie ist      ║
  2550.        ║                 positiv, wenn das Verwaltungsfeld in der Memory     ║
  2551.        ║                 abgelegt ist und negativ, wenn es in einer          ║
  2552.        ║                 temporären Datei abgelegt ist.                      ║
  2553.        ║INTEGER          Return: Fehlerflag                                  ║
  2554.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  2555.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  2556.        ╟─────────────────────────────────────────────────────────────────────╢
  2557.        ║Subroutinen:     CREMEM,GETMEM,PUTMEM,SCREEN                         ║
  2558.        ╟─────────────────────────────────────────────────────────────────────╢
  2559.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  2560.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  2561.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  2562.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  2563.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  2564.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2565.     
  2566.  
  2567.                                                                       Seite 56
  2568.  
  2569.  
  2570.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  2571.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2572.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  2573.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2574.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  2575.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2576.        ║                 RETURN                                              ║
  2577.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  2578.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  2579.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  2580.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  2581.        ║                 File ausgelagert wird. Mit der Subrouteine "GETFEN" ║
  2582.        ║                 wird das gespeicherte Fenster an eine andere        ║
  2583.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  2584.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  2585.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  2586.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  2587.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  2588.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  2589.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  2590.        ║                 Meldung ausgegeben.                                 ║
  2591.        ╚═════════════════════════════════════════════════════════════════════╝
  2592.     
  2593.  
  2594.                                                                       Seite 57
  2595.  
  2596.  
  2597.        ╔═════════════════════════════════════════════════════════════════════╗
  2598.        ║Beschreibung der Subroutine MAKFEN (NR,FELD,H,B,VSEG,COL,FLAG)       ║
  2599.        ║Die Subroutine kopiert ein in einem zweidimensionalen Characterfeld  ║
  2600.        ║angelegtes Bildschirmfenster mit der Hintergrundfarbe "COL" in die   ║
  2601.        ║Memory. Wenn keine Memory mehr verfügbar ist, wird das Bildschirm-   ║
  2602.        ║fenster in einer temporären Datei abgelegt. Informationen über die   ║
  2603.        ║Ausmaße des Bildschirmfensters und über die Adresse an der es        ║
  2604.        ║gespeichert ist, werden automatisch in einem Verwaltungsfeld, das    ║
  2605.        ║sich ebenfalls in der Memory befindet, abgelegt. Das Verwaltungsfeld ║
  2606.        ║wird angelegt, wenn in der Variablen "VSEG" eine Null an die         ║
  2607.        ║Subroutine übergeben wird. In "VSEG" wird die Adresse des            ║
  2608.        ║Verwaltungsfeldes an das rufende Programm zurückgegeben. Sie wird    ║
  2609.        ║für alle zukünftigen Zugriffe auf bis zu 30 im Verwaltungsfeld       ║
  2610.        ║definierte Fenster durch Fensterroutinen benötigt. Die Nummer des    ║
  2611.        ║abzulegenden Fensters wird in der Variablen "NR" übergeben. Sie kann ║
  2612.        ║zum Aufbau einer hirarchischen Struktur der Bildschirmfenster benutzt║
  2613.        ║werden. Es können mehrere Verwaltungsfelder nebeneinander benutzt    ║
  2614.        ║werden, so daß insgesamt mehr als 30 Bildschirmfenster in der Memory ║
  2615.        ║bzw. temporären File abgelegt werden können. Wenn diese Subroutine   ║
  2616.        ║von einem Programm genutzt wird, darf keine Datei mit dem Unit 100   ║
  2617.        ║eröffnet werden, da das Unit für die temporäre Datei benötigt wird.  ║
  2618.        ║Bei erfolgreicher Beendigung der Subroutine steht in "FLAG" eine     ║
  2619.        ║Null, sonst eine Eins.                                               ║
  2620.        ╟─────────────────────────────────────────────────────────────────────╢
  2621.        ║Parameter:                                                           ║
  2622.        ║INTEGER          Nummer des in der Memory abzulegenden Bildschirm-   ║
  2623.        ║                 fensters [ 1 bis 30 ]. Wenn die Nummer schon        ║
  2624.        ║                 durch ein anderes Bildschirmfenster belegt ist,     ║
  2625.        ║                 wird die Routine mit "FLAG" gleich Eins abgebrochen.║
  2626.        ║                 Durch die Nummer wird die Hirarchie der Bildschirm- ║
  2627.        ║                 fenster festgelegt.                                 ║
  2628.        ║CHARACTERFELD    Characterfeld dessen Inhalt als Bildschirmfenster   ║
  2629.        ║                 abgelegt werden soll. [ FELD(H)*B ].                ║
  2630.        ║INTEGER          Höhe des Bildschirmfensters in Zeilen [ 1 bis 25 ]. ║
  2631.        ║INTEGER          Breite des Bildschirmfensters in Spalten            ║
  2632.        ║                 [ 1 bis 80 ].                                       ║
  2633.        ║INTEGER          Zum Anlegen des Verwaltungsfeldes wird eine Null    ║
  2634.        ║                 an die Routine übergeben.                           ║
  2635.        ║                 Return: Adresse des Verwaltungsfeldes. Sie ist      ║
  2636.        ║                 positiv, wenn das Verwaltungsfeld in der Memory     ║
  2637.        ║                 abgelegt ist und negativ, wenn es in einer          ║
  2638.        ║                 temporären Datei abgelegt ist.                      ║
  2639.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  2640.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2641.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  2642.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2643.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  2644.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2645.        ║                 Bit 7    : blinken                                  ║
  2646.        ║INTEGER          Return: Fehlerflag                                  ║
  2647.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  2648.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  2649.        ╟─────────────────────────────────────────────────────────────────────╢
  2650.        ║Subroutinen:     ATTRIB,CREMEM,GETMEM,PUTMEM                         ║
  2651.        ╟─────────────────────────────────────────────────────────────────────╢
  2652.     
  2653.  
  2654.                                                                       Seite 58
  2655.  
  2656.  
  2657.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  2658.        ║                 CHARACTER FELD(2)*30                                ║
  2659.        ║                 DATA H/2/,B/30/,ZEI/11/,SP/40/,VSEG/0/,COL/23/      ║
  2660.        ║                 FELD(1)='TESTTEXT FÜR DIE'                          ║
  2661.        ║                 FELD(2)='SUBROUTINE MAKFEN'                         ║
  2662.        ║                 CALL MAKFEN (3,FELD,H,B,COL,VSEG,I)                 ║
  2663.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2664.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  2665.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2666.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  2667.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2668.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  2669.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2670.        ║                 RETURN                                              ║
  2671.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  2672.        ║                 Mit der Subroutine "MAKFEN" wird ein in "FELD"      ║
  2673.        ║                 abgelegter Text mit dem Farbattribut "COL" als      ║
  2674.        ║                 Bildschirmfenster in die Memory bzw. in einen       ║
  2675.        ║                 temporären File ausgelagert. Mit der Subrouteine    ║
  2676.        ║                 "GETFEN" wird das gespeicherte Fenster anschließend ║
  2677.        ║                 positioniert auf den Bildschirms geschrieben. Die   ║
  2678.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  2679.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  2680.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  2681.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  2682.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  2683.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  2684.        ║                 Meldung ausgegeben.                                 ║
  2685.        ╚═════════════════════════════════════════════════════════════════════╝
  2686.     
  2687.  
  2688.                                                                       Seite 59
  2689.  
  2690.  
  2691.        ╔═════════════════════════════════════════════════════════════════════╗
  2692.        ║Beschreibung der Subroutine                                          ║
  2693.        ║TEXFEN (NR,ANZ,SPZ,LANG,UNIT,SNR,COL,VSEG,FLAG)                      ║
  2694.        ║Die Subroutine liest aus einer direct organisierten Datei mit dem    ║
  2695.        ║Unit "UNIT" ab der Satznummer "SNR" eine Anzahl "ANZ" Characterstings║
  2696.        ║ein. Die Characterstrings werden "SPZ"-spaltig mit der jeweiligen    ║
  2697.        ║Länge "LAN" und dem Farbattribut "COL" einem Fenster mit der Nummer  ║
  2698.        ║"NR" zugeordnet. Die Ausmaße des Fensters werden automatisch         ║
  2699.        ║ermittelt. Das Fenster darf noch nicht vorhanden sein. Die Subroutine║
  2700.        ║eignet sich als Vorbereitung für die Routinen "ME1FEN" und "MENFEN". ║
  2701.        ║Informationen über die Ausmaße des Bildschirmfensters und über die   ║
  2702.        ║Adresse an der es gespeichert ist, werden automatisch in einem       ║
  2703.        ║Verwaltungsfeld, das sich ebenfalls in der Memory befindet, abgelegt.║
  2704.        ║Die Adresse des Verwaltungsfeldes wird in "VSEG" übergeben. Um ein   ║
  2705.        ║neues Verwaltungsfeld anzulegen, muß in "VSEG" eine Null übergeben   ║
  2706.        ║werden. Die Adresse wird für alle Zugriffe auf bis zu 30 im          ║
  2707.        ║Verwaltungsfeld definierte Fenster benötigt. Die Nummer des mit Text ║
  2708.        ║zu belegenden Bildschirmfensters stellt die Priorität gegenüber      ║
  2709.        ║anderen Fensters dar. Sie wird in der Variablen "NR" übergeben.      ║
  2710.        ║Wenn diese Subroutine benutzt wird, darf das Dateiunit 100 vom       ║
  2711.        ║rufenden Programm nicht verwendet werden. Bei erfolgreicher          ║
  2712.        ║Beendigung der Routine steht in "FLAG" eine Null, sonst eine Eins.   ║
  2713.        ╟─────────────────────────────────────────────────────────────────────╢
  2714.        ║Parameter:                                                           ║
  2715.        ║INTEGER          Nummer des mit Texten zu beschreibenden Bildschirm- ║
  2716.        ║                 fensters [ 1 bis 30 ]. Wenn die Nummer bereits      ║
  2717.        ║                 durch ein Bildschirmfenster belegt ist, wird die    ║
  2718.        ║                 Routine mit "FLAG" gleich Eins abgebrochen.         ║
  2719.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  2720.        ║                 fenster festgelegt.                                 ║
  2721.        ║INTEGER          Anzahl der gewünschten Textfelder.                  ║
  2722.        ║INTEGER          Anzahl der nebeneinander angeordneten Textfelder im ║
  2723.        ║                 Bildschirmfenster.                                  ║
  2724.        ║INTEGER          Länge der im Fenster abzulegenden Texte.            ║
  2725.        ║INTEGER          Unitnummer der direct organisierten Datei, aus der  ║
  2726.        ║                 die Texte gelesen werden sollen.                    ║
  2727.        ║INTEGER          Satznummer in der direct organisierten Datei, ab der║
  2728.        ║                 der Text abgelegt ist.                              ║
  2729.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  2730.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2731.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  2732.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2733.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  2734.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2735.        ║                 Bit 7    : blinken                                  ║
  2736.        ║INTEGER          Adresse des Verwaltungsfeldes oder 0 zum Anlegen    ║
  2737.        ║                 eines neuen Verwaltungsfeldes.                      ║
  2738.        ║                 Return: bei Eingabe einer 0: Adresse des            ║
  2739.        ║                 Verwaltungsfeldes.                                  ║
  2740.        ║INTEGER          Return: Fehlerflag                                  ║
  2741.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  2742.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  2743.        ╟─────────────────────────────────────────────────────────────────────╢
  2744.        ║Subroutinen:     ATTRIB,CREMEM,GETMEM,PUTMEM                         ║
  2745.        ╟─────────────────────────────────────────────────────────────────────╢
  2746.     
  2747.  
  2748.                                                                       Seite 60
  2749.  
  2750.  
  2751.        ║Beispiel:        INTEGER FELD(12),VSEG                               ║
  2752.        ║                 OPEN (1,FILE='TEST',ACCESS='DIRECT',                ║
  2753.        ║                -FORM='FORMATTED',RECL=72,STATUS='OLD')              ║
  2754.        ║                 CALL TEXFEN (2,12,3,20,1,1,23,VSEG,I)               ║
  2755.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2756.        ║                 CALL RAMFEN (2,1,0,'Auswählen: <Esc>','NUM',VSEG,I) ║
  2757.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2758.        ║                 CALL GETFEN (2,5,10,VSEG,I)                         ║
  2759.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2760.        ║                 CALL ME1FEN (2,12,3,FELD,VSEG,I)                    ║
  2761.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2762.        ║                 RETURN                                              ║
  2763.        ║               1 WRITE(*,'(1X,A)') 'FEHLER'                          ║
  2764.        ║                 Aus einer direct orgsanisierten Datei mit dem Unit 1║
  2765.        ║                 werden mit Hilfe der Subroutine "TEXFEN" 12 Menü-   ║
  2766.        ║                 texte dreispaltig mit einer jeweiligen Länge von    ║
  2767.        ║                 20 Characters und dem Farbattribut 23 im Fenster    ║
  2768.        ║                 Nummer 2 abgelegt.                                  ║
  2769.        ║                 Die Subroutine "RAMFEN" umgibt das Menüfeld im      ║
  2770.        ║                 Fenster mit einen einfachen Rahmen und schreibt in  ║
  2771.        ║                 die erste Zeile des Fensters eine Meldung. In die   ║
  2772.        ║                 letzte Zeile des Fensters wird außerdem die Nummer  ║
  2773.        ║                 des Fensters eingeblendet. Rahmen und Texte werden  ║
  2774.        ║                 in der vorhandenen Farbe dargestellt.               ║
  2775.        ║                 Die Subroutine "GETFEN" öffnet das Fenster mit dem  ║
  2776.        ║                 Menütext am Bildschirm ab der 5. Zeile und der 10.  ║
  2777.        ║                 Spalte.                                             ║
  2778.        ║                 "ME1FEN" ermöglicht die Auswahl eines einzelnen     ║
  2779.        ║                 Menüpunktes mit Hilfe der Cursortasten und der      ║
  2780.        ║                 <Escape>-Taste. Das der Auswahl entsprechende       ║
  2781.        ║                 Äquivalent in "FELD" wird dadurch ungleich Null     ║
  2782.        ║                 gesetzt. Es ist zu beachten, daß die Anzahl der     ║
  2783.        ║                 Menüpunkte und die Menüspaltenzahl in den Routinen  ║
  2784.        ║                 "TEXFEN" und "ME1FEN" übereinstimmen.               ║
  2785.        ║                 Wenn in einer Subroutine ein Fehler auftritt, wird  ║
  2786.        ║                 eine Fehlermeldung ausgegeben.                      ║
  2787.        ╚═════════════════════════════════════════════════════════════════════╝
  2788.     
  2789.  
  2790.                                                                       Seite 61
  2791.  
  2792.  
  2793.        ╔═════════════════════════════════════════════════════════════════════╗
  2794.        ║Beschreibung der Subroutine GETFEN (NR,ZEI,SP,VSEG,FLAG)             ║
  2795.        ║Die Subroutine kopiert ein in der Memory oder in einem temporären    ║
  2796.        ║File abgelegtes Bildschirmfenster an die durch "ZEI" und "SP"        ║
  2797.        ║definierte Position auf den Bildschirm. Informationen über die       ║
  2798.        ║Ausmaße des Bildschirmfensters und über die Adresse an der es        ║
  2799.        ║gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das   ║
  2800.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  2801.        ║Adresse des Verwaltungsfeldes, das vorher mit Hilfe anderer Fenster- ║
  2802.        ║routinen angelegt worden ist, übergeben. Die Adresse wird für alle   ║
  2803.        ║zukünftigen Zugriffe auf bis zu 30 im Verwaltungsfeld definierte     ║
  2804.        ║Fenster benötigt. Die Nummer des darzustellenden Bildschirmfensters  ║
  2805.        ║stellt die Priorität gegenüber anderen Fensters dar. Sie wird in der ║
  2806.        ║Variablen "NR" übergeben. Die Position des auf dem Bildschirm        ║
  2807.        ║dargestellten Fensters wird im Verwaltungsfeld aktualisiert. Auf dem ║
  2808.        ║Bildschirm vorhandene Fenster werden von der Routine ihrer in "NR"   ║
  2809.        ║vergebenen Priorität entsprechend berücksichtigt. Bei erfolgreicher  ║
  2810.        ║Beendigung der Subroutine ist in "FLAG" eine Null, sonst eine Eins.  ║
  2811.        ╟─────────────────────────────────────────────────────────────────────╢
  2812.        ║Parameter:                                                           ║
  2813.        ║INTEGER          Nummer des aus der Memory auszulesenden Bildschirm- ║
  2814.        ║                 fensters [ 1 bis 30 ]. Wenn die Nummer noch nicht   ║
  2815.        ║                 durch ein Bildschirmfenster belegt ist, wird die    ║
  2816.        ║                 Routine mit "FLAG" gleich Eins abgebrochen.         ║
  2817.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  2818.        ║                 fenster festgelegt.                                 ║
  2819.        ║INTEGER          Zeile ab der das Bildschirmfenster dargestellt      ║
  2820.        ║                 werden soll [ 1 bis 25 ].                           ║
  2821.        ║INTEGER          Spalte, ab der das Bildschirmfenster dargestellt    ║
  2822.        ║                 werden soll [ 1 bis 80 ].                           ║
  2823.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  2824.        ║INTEGER          Return: Fehlerflag                                  ║
  2825.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  2826.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  2827.        ╟─────────────────────────────────────────────────────────────────────╢
  2828.        ║Subroutinen:     GETMEM,PUTMEM,SCREEN                                ║
  2829.        ╟─────────────────────────────────────────────────────────────────────╢
  2830.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  2831.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  2832.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  2833.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  2834.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  2835.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2836.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  2837.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2838.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  2839.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2840.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  2841.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2842.        ║                 RETURN                                              ║
  2843.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  2844.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  2845.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  2846.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  2847.        ║                 File ausgelagert wird. Mit der Subroutine "GETFEN"  ║
  2848.     
  2849.  
  2850.                                                                       Seite 62
  2851.  
  2852.  
  2853.        ║                 wird das gespeicherte Fenster an eine andere        ║
  2854.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  2855.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  2856.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  2857.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  2858.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  2859.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  2860.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  2861.        ║                 Meldung ausgegeben.                                 ║
  2862.        ╚═════════════════════════════════════════════════════════════════════╝
  2863.     
  2864.  
  2865.                                                                       Seite 63
  2866.  
  2867.  
  2868.        ╔═════════════════════════════════════════════════════════════════════╗
  2869.        ║Beschreibung der Subroutine PRIFEN (NR1,NR2,VSEG,COL,FLAG)           ║
  2870.        ║Die Subroutine tauscht die Priorität zweier Bildschirmfenster mit den║
  2871.        ║Fensternummern "NR1" und "NR2" untereinander aus. Wenn ein oder beide║
  2872.        ║Fenster am Bildschirm vorhanden sind, erfolgt die Darstellung mit der║
  2873.        ║jeweils neuen Priorität. Wenn die Fenster nicht am Bildschirm        ║
  2874.        ║vorhanden sind, werden die erforderlichen Werte im Verwaltungsfeld   ║
  2875.        ║geändert. Dabei ist es nicht erforderlich, daß beide Fenster im Ver- ║
  2876.        ║waltungsfeld vorhanden sind. Der frei werdende Hintergrund wird mit  ║
  2877.        ║dem in "COL" übergebenen Farbattribut gelöscht oder mit dem Inhalt   ║
  2878.        ║des Bildschirmfensters Nummer 1 beschrieben. Informationen über      ║
  2879.        ║die Ausmaße des Bildschirmfensters und über die Adresse an der es    ║
  2880.        ║gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das   ║
  2881.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  2882.        ║Adresse des Verwaltungsfeldes übergeben. Die Adresse wird für alle   ║
  2883.        ║Zugriffe auf Fensterroutinen benötigt. Die Nummern der zu ändernden  ║
  2884.        ║Fenster stellen die Priorität gegenüber anderen Fenstern dar. Sie    ║
  2885.        ║werden in der Variablen "NR1" und "NR2" übergeben. Die neuen         ║
  2886.        ║Prioritäten der Fensters werden im Verwaltungsfeld aktualisiert.     ║
  2887.        ║Andere auf dem Bildschirm vorhandene Fenster werden von der Routine  ║
  2888.        ║ihrer eigenen Priorität entsprechend berücksichtigt. Bei erfolg-     ║
  2889.        ║reicher Beendigung der Subroutine wird in "FLAG" eine Null zurück-   ║
  2890.        ║gegeben, sonst eine Eins.                                            ║
  2891.        ╟─────────────────────────────────────────────────────────────────────╢
  2892.        ║Parameter:                                                           ║
  2893.        ║INTEGER          Nummer mit der Priorität des ersten Fensters        ║
  2894.        ║                 [ 1 bis 30 ].                                       ║
  2895.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  2896.        ║                 fenster festgelegt.                                 ║
  2897.        ║INTEGER          Nummer mit der Priorität des zweiten Fensters       ║
  2898.        ║                 [ 1 bis 30 ].                                       ║
  2899.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  2900.        ║                 fenster festgelegt.                                 ║
  2901.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  2902.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  2903.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2904.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  2905.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2906.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  2907.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2908.        ║                 Bit 7    : blinken                                  ║
  2909.        ║                 oder: 0 zum Beschreiben des Hintergrundes mit dem   ║
  2910.        ║                 Inhalt des unter der Nummer 1 abgelegten Fensters.  ║
  2911.        ║INTEGER          Return: Fehlerflag                                  ║
  2912.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  2913.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  2914.        ╟─────────────────────────────────────────────────────────────────────╢
  2915.        ║Subroutinen:     CLOFEN,GETFEN,GETMEM,PUTMEM                         ║
  2916.        ╟─────────────────────────────────────────────────────────────────────╢
  2917.        ║Beispiel:        INTEGER VSEG,COL                                    ║
  2918.        ║                 DATA VSEG/0/,COL/23/                                ║
  2919.        ║                 CALL LOES (10,10,5,5,32,COL,0)                      ║
  2920.        ║                 CALL RAHM (10,10,5,5,0,COL,0)                       ║
  2921.        ║                 CALL PUTFEN (3,10,10,5,5,VSEG,I)                    ║
  2922.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2923.     
  2924.  
  2925.                                                                       Seite 64
  2926.  
  2927.  
  2928.        ║                 CALL LOES (11,11,9,9,32,COL,0)                      ║
  2929.        ║                 CALL RAHM (11,11,9,9,0,COL,0)                       ║
  2930.        ║                 CALL PUTFEN (5,11,11,9,9,VSEG,I)                    ║
  2931.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2932.        ║                 CALL PRIFEN (3,5,VSEG,COL,I)                        ║
  2933.        ║                 IF (I .NE. 0) GOTO 1                                ║
  2934.        ║                 RETURN                                              ║
  2935.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  2936.        ║                 Mit den Subroutinen "LOES" und "RAHM" und "PUTFEN"  ║
  2937.        ║                 werden zwei Bildschirmfenster mit den Nummern 3 und ║
  2938.        ║                 5 angelegt und mit der entsprechenden Priorität am  ║
  2939.        ║                 Bildschirm dargestellt. "PRIFEN" wechselt im        ║
  2940.        ║                 Verwaltungsfeld die Nummern untereinander aus und   ║
  2941.        ║                 ändert die Bildschirmdarstellung der neuen          ║
  2942.        ║                 Priorität entsprechend um. Eventuell freiwerdender  ║
  2943.        ║                 Hintergrund wird mit dem Farbattribut "COL"         ║
  2944.        ║                 beschrieben. Beim Auftreten eines Fehlers wird eine ║
  2945.        ║                 Meldung ausgegeben.                                 ║
  2946.        ╚═════════════════════════════════════════════════════════════════════╝
  2947.     
  2948.  
  2949.                                                                       Seite 65
  2950.  
  2951.  
  2952.        ╔═════════════════════════════════════════════════════════════════════╗
  2953.        ║Beschreibung der Subroutine MOVFEN (NR,VSEG,COL,FLAG)                ║
  2954.        ║Die Subroutine bewegt ein am Bildschirm vorhandenes Fenster mit Hilfe║
  2955.        ║der Cursortasten über den Bildschirm. Informationen über die         ║
  2956.        ║Ausmaße des Bildschirmfensters und über die Adresse an der es        ║
  2957.        ║gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das   ║
  2958.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  2959.        ║Adresse des Verwaltungsfeldes, das vorher mit einer anderen Fenster- ║
  2960.        ║routine angelegt worden ist, übergeben. Die Adresse wird für alle    ║
  2961.        ║Zugriffe auf bis zu 30 im Verwaltungsfeld definierte Fenster durch   ║
  2962.        ║Fensterroutinen benötigt. Die Nummer des zu bewegenden Fensters      ║
  2963.        ║stellt die Priorität gegenüber anderen Fensters dar. Sie wird in der ║
  2964.        ║Variablen "NR" übergeben. Die Position des über den Bildschirm       ║
  2965.        ║bewegten Fensters wird im Verwaltungsfeld aktualisiert. Auf dem      ║
  2966.        ║Bildschirm vorhandene Fenster werden von der Routine ihrer in "NR"   ║
  2967.        ║vergebenen Priorität entsprechend berücksichtigt. Der Hintergrund    ║
  2968.        ║kann entweder mit dem im Verwaltungsfeld unter der Nummer 1          ║
  2969.        ║abgelegten Fensterinhalt oder mit einer Hintergrundfarbe "COL"       ║
  2970.        ║beschrieben werden. Die Funktion wird mit der "Escape"- oder mit der ║
  2971.        ║"Return"-Taste beendet. Bei erfolgreicher Beendigung der Subroutine  ║
  2972.        ║ist in "FLAG" eine Null, sonst eine Eins.                            ║
  2973.        ╟─────────────────────────────────────────────────────────────────────╢
  2974.        ║Parameter:                                                           ║
  2975.        ║INTEGER          Nummer des über den Bildschirm zu bewegenden        ║
  2976.        ║                 Fensters [ 1 bis 30 ]. Wenn die Nummer noch nicht   ║
  2977.        ║                 durch ein Bildschirmfenster belegt ist, wird die    ║
  2978.        ║                 Routine mit "FLAG" gleich Eins abgebrochen.         ║
  2979.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  2980.        ║                 fenster festgelegt.                                 ║
  2981.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  2982.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  2983.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  2984.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  2985.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  2986.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  2987.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  2988.        ║                 Bit 7    : blinken                                  ║
  2989.        ║                 oder: 0 zum Beschreiben des Hintergrundes mit dem   ║
  2990.        ║                 Inhalt des unter der Nummer 1 abgelegten Fensters.  ║
  2991.        ║INTEGER          Return: Fehlerflag                                  ║
  2992.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  2993.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  2994.        ╟─────────────────────────────────────────────────────────────────────╢
  2995.        ║Subroutinen:     ATTRIB,GETMEM,PUTMEM,SCREEN                         ║
  2996.        ╟─────────────────────────────────────────────────────────────────────╢
  2997.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  2998.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  2999.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  3000.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  3001.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  3002.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3003.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  3004.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3005.        ║                 CALL MOVFEN (3,VSEG,COL,I)                          ║
  3006.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3007.     
  3008.  
  3009.                                                                       Seite 66
  3010.  
  3011.  
  3012.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  3013.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3014.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  3015.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3016.        ║                 RETURN                                              ║
  3017.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  3018.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  3019.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  3020.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  3021.        ║                 File ausgelagert wird. Mit der Subroutine "GETFEN"  ║
  3022.        ║                 wird das gespeicherte Fenster an eine andere        ║
  3023.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  3024.        ║                 Subroutine "MOVFEN" bewegt das Fenster mit Hilfe der║
  3025.        ║                 Cursortasten über den gesamten Bildschirm. Die      ║
  3026.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  3027.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  3028.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  3029.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  3030.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  3031.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  3032.        ║                 Meldung ausgegeben.                                 ║
  3033.        ╚═════════════════════════════════════════════════════════════════════╝
  3034.     
  3035.  
  3036.                                                                       Seite 67
  3037.  
  3038.  
  3039.        ╔═════════════════════════════════════════════════════════════════════╗
  3040.        ║Beschreibung der Subroutine MOPFEN (NR,ZEI,SP,VSEG,COL,FLAG)         ║
  3041.        ║Die Subroutine verändert die Position eines geöffneten Fensters oder ║
  3042.        ║die im Verwaltungsfeld vorhandenen Werte für die Position. Dabei wird║
  3043.        ║in "ZEI" die Anfangszeile und in "SP" die Anfangsspalte des          ║
  3044.        ║Bildschirmfensters übergeben. Der frei werdende Hintergrund wird mit ║
  3045.        ║dem in "COL" übergebenen Farbattribut gelöscht oder mit dem Inhalt   ║
  3046.        ║des Bildschirmfensters Nummer 1 beschrieben. Informationen über      ║
  3047.        ║die Ausmaße des Bildschirmfensters und über die Adresse an der es    ║
  3048.        ║gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das   ║
  3049.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  3050.        ║Adresse des Verwaltungsfeldes übergeben. Die Adresse wird für alle   ║
  3051.        ║Zugriffe auf Fensterroutinen benötigt. Die Nummer des zu ändernden   ║
  3052.        ║Fensters stellt die Priorität gegenüber anderen Fenstern dar. Sie    ║
  3053.        ║wird in der Variablen "NR" übergeben. Die neuen Positionsangaben     ║
  3054.        ║des Fensters werden im Verwaltungsfeld aktualisiert. Auf dem         ║
  3055.        ║Bildschirm vorhandene Fenster werden von der Routine ihrer in "NR"   ║
  3056.        ║vergebenen Priorität entsprechend berücksichtigt. Bei erfolgreicher  ║
  3057.        ║Beendigung der Subroutine wird in "FLAG" eine Null zurückgegeben,    ║
  3058.        ║sonst eine Eins.                                                     ║
  3059.        ╟─────────────────────────────────────────────────────────────────────╢
  3060.        ║Parameter:                                                           ║
  3061.        ║INTEGER          Nummer des in der Größe zu ändernden Fensters       ║
  3062.        ║                 [ 1 bis 30 ]. Wenn die Nummer noch nicht durch ein  ║
  3063.        ║                 Bildschirmfenster belegt ist, wird die Routine mit  ║
  3064.        ║                 "FLAG" gleich Eins abgebrochen.                     ║
  3065.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3066.        ║                 fenster festgelegt.                                 ║
  3067.        ║INTEGER          Neue Anfangszeile des Bildschirmfensters.           ║
  3068.        ║                 Ungültige Angaben werden von der Routine automatisch║
  3069.        ║                 korrigiert.                                         ║
  3070.        ║INTEGER          Neue Anfangsspalte des Bildschirmfensters.          ║
  3071.        ║                 Ungültige Angaben werden von der Routine automatisch║
  3072.        ║                 korrigiert.                                         ║
  3073.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3074.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  3075.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  3076.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  3077.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3078.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  3079.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3080.        ║                 Bit 7    : blinken                                  ║
  3081.        ║                 oder: 0 zum Beschreiben des Hintergrundes mit dem   ║
  3082.        ║                 Inhalt des unter der Nummer 1 abgelegten Fensters.  ║
  3083.        ║INTEGER          Return: Fehlerflag                                  ║
  3084.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3085.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3086.        ╟─────────────────────────────────────────────────────────────────────╢
  3087.        ║Subroutinen:     CLOFEN,GETFEN,GETMEM,PUTMEM                         ║
  3088.        ╟─────────────────────────────────────────────────────────────────────╢
  3089.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  3090.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  3091.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  3092.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  3093.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  3094.     
  3095.  
  3096.                                                                       Seite 68
  3097.  
  3098.  
  3099.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3100.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  3101.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3102.        ║                 CALL MOPFEN (3,15,15,VSEG,COL,I)                    ║
  3103.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3104.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  3105.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3106.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  3107.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3108.        ║                 RETURN                                              ║
  3109.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  3110.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  3111.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  3112.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  3113.        ║                 File ausgelagert wird. Mit der Subroutine "GETFEN"  ║
  3114.        ║                 wird das gespeicherte Fenster an eine andere        ║
  3115.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  3116.        ║                 Subroutine "MOPFEN" ermöglicht das Verändern der    ║
  3117.        ║                 aktuellen Position des Bildschirmfensters.          ║
  3118.        ║                 Die Subroutine "CLOFEN" löscht den das Fenster      ║
  3119.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  3120.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  3121.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  3122.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  3123.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  3124.        ║                 Meldung ausgegeben.                                 ║
  3125.        ╚═════════════════════════════════════════════════════════════════════╝
  3126.     
  3127.  
  3128.                                                                       Seite 69
  3129.  
  3130.  
  3131.        ╔═════════════════════════════════════════════════════════════════════╗
  3132.        ║Beschreibung der Subroutine GROFEN (NR,VSEG,COL,FLAG)                ║
  3133.        ║Die Subroutine verändert die Größe eines am Bildschirm vorhandenen   ║
  3134.        ║Fensters mit Hilfe der Cursortasten. Dazu wird das Fenster           ║
  3135.        ║vorübergehend mit der höchsten Priorität dargestellt. Der vergrößerte║
  3136.        ║Bereich des Fensters wird mit der Hintergrundfarbe "COL" beschrieben ║
  3137.        ║oder mit der Farbe des Fensters, wenn "COL" Null ist. Der vergrößerte║
  3138.        ║Bereich wird vorübergehend mit Zeichen "░" beschrieben, die zum      ║
  3139.        ║Schluß der Subroutine gegen Blanks getauscht werden. Informationen   ║
  3140.        ║über die Ausmaße des Bildschirmfensters und über die Adresse an der  ║
  3141.        ║es gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das║
  3142.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  3143.        ║Adresse des Verwaltungsfeldes übergeben. Die Adresse wird für alle   ║
  3144.        ║Zugriffe auf Fensterroutinen benötigt. Die Nummer des zu ändernden   ║
  3145.        ║Fensters stellt die Priorität gegenüber anderen Fenstern dar. Sie    ║
  3146.        ║wird in der Variablen "NR" übergeben. Die Größe des am Bildschirm    ║
  3147.        ║geänderten Fensters wird im Verwaltungsfeld aktualisiert. Auf dem    ║
  3148.        ║Bildschirm vorhandene Fenster werden von der Routine ihrer in "NR"   ║
  3149.        ║vergebenen Priorität entsprechend berücksichtigt. Die Subroutine wird║
  3150.        ║mit der "Escape"- oder mit der "Return"-Taste beendet. Bei           ║
  3151.        ║erfolgreicher Beendigung der Subroutine ist in "FLAG" eine Null,     ║
  3152.        ║sonst eine Eins.                                                     ║
  3153.        ╟─────────────────────────────────────────────────────────────────────╢
  3154.        ║Parameter:                                                           ║
  3155.        ║INTEGER          Nummer des am Bildschirm in der Größe zu ändernden  ║
  3156.        ║                 Fensters [ 1 bis 30 ]. Wenn die Nummer noch nicht   ║
  3157.        ║                 durch ein Bildschirmfenster belegt ist, wird die    ║
  3158.        ║                 Routine mit "FLAG" gleich Eins abgebrochen.         ║
  3159.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3160.        ║                 fenster festgelegt.                                 ║
  3161.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3162.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  3163.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  3164.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  3165.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3166.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  3167.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3168.        ║                 Bit 7    : blinken                                  ║
  3169.        ║                 oder: 0 zum Beschreiben des Hintergrundes mit der   ║
  3170.        ║                 aktuellen Hintergrundfarbe des Fensters.            ║
  3171.        ║INTEGER          Return: Fehlerflag                                  ║
  3172.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3173.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3174.        ╟─────────────────────────────────────────────────────────────────────╢
  3175.        ║Subroutinen:     ATTRIB,FREFEN,GETFEN,GETMEM,PUTFEN,PUTMEM,SCREEN,   ║
  3176.        ║                 TAST                                                ║
  3177.        ╟─────────────────────────────────────────────────────────────────────╢
  3178.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  3179.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  3180.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  3181.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  3182.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  3183.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3184.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  3185.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3186.     
  3187.  
  3188.                                                                       Seite 70
  3189.  
  3190.  
  3191.        ║                 CALL GROFEN (3,VSEG,COL,I)                          ║
  3192.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3193.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  3194.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3195.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  3196.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3197.        ║                 RETURN                                              ║
  3198.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  3199.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  3200.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  3201.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  3202.        ║                 File ausgelagert wird. Mit der Subroutine "GETFEN"  ║
  3203.        ║                 wird das gespeicherte Fenster an eine andere        ║
  3204.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  3205.        ║                 Subroutine "GROFEN" ermöglicht das Verkleinern oder ║
  3206.        ║                 Vergrößern des Fensters auf dem Bildschirm. Die     ║
  3207.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  3208.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  3209.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  3210.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  3211.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  3212.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  3213.        ║                 Meldung ausgegeben.                                 ║
  3214.        ╚═════════════════════════════════════════════════════════════════════╝
  3215.     
  3216.  
  3217.                                                                       Seite 71
  3218.  
  3219.  
  3220.        ╔═════════════════════════════════════════════════════════════════════╗
  3221.        ║Beschreibung der Subroutine GRPFEN (NR,H,B,VSEG,COL,FLAG)            ║
  3222.        ║Die Subroutine verändert die Größe eines geöffneten oder             ║
  3223.        ║geschlossenen Bildschirmfensters. Dabei wird in den Parametern "H"   ║
  3224.        ║die neue Höhe und in "B" die neue Breite übergeben. Der vergrößerte  ║
  3225.        ║Bereich des Fensters wird mit der Hintergrundfarbe "COL" beschrieben ║
  3226.        ║oder mit der Farbe des Fensters, wenn "COL" Null ist. Informationen  ║
  3227.        ║über die Ausmaße des Bildschirmfensters und über die Adresse an der  ║
  3228.        ║es gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das║
  3229.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  3230.        ║Adresse des Verwaltungsfeldes übergeben. Die Adresse wird für alle   ║
  3231.        ║Zugriffe auf Fensterroutinen benötigt. Die Nummer des zu ändernden   ║
  3232.        ║Fensters stellt die Priorität gegenüber anderen Fenstern dar. Sie    ║
  3233.        ║wird in der Variablen "NR" übergeben. Die Größe des am Bildschirm    ║
  3234.        ║geänderten Fensters wird im Verwaltungsfeld aktualisiert. Auf dem    ║
  3235.        ║Bildschirm vorhandene Fenster werden von der Routine ihrer in "NR"   ║
  3236.        ║vergebenen Priorität entsprechend berücksichtigt. Bei erfolgreicher  ║
  3237.        ║Beendigung der Subroutine ist in "FLAG" eine Null, sonst eine Eins.  ║
  3238.        ╟─────────────────────────────────────────────────────────────────────╢
  3239.        ║Parameter:                                                           ║
  3240.        ║INTEGER          Nummer des in der Größe zu ändernden Fensters       ║
  3241.        ║                 [ 1 bis 30 ]. Wenn die Nummer noch nicht durch ein  ║
  3242.        ║                 Bildschirmfenster belegt ist, wird die Routine mit  ║
  3243.        ║                 "FLAG" gleich Eins abgebrochen.                     ║
  3244.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3245.        ║                 fenster festgelegt.                                 ║
  3246.        ║INTEGER          Neue Höhe des Bildschirmfensters in Zeilen.         ║
  3247.        ║                 Ungültige Angaben werden von der Routine automatisch║
  3248.        ║                 korrigiert.                                         ║
  3249.        ║INTEGER          Neue Breite des Bildschirmfensters in Spalten.      ║
  3250.        ║                 Ungültige Angaben werden von der Routine automatisch║
  3251.        ║                 korrigiert.                                         ║
  3252.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3253.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  3254.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  3255.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  3256.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3257.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  3258.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3259.        ║                 Bit 7    : blinken                                  ║
  3260.        ║                 oder: 0 zum Beschreiben des Hintergrundes mit der   ║
  3261.        ║                 aktuellen Fensterfarbe.                             ║
  3262.        ║INTEGER          Return: Fehlerflag                                  ║
  3263.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3264.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3265.        ╟─────────────────────────────────────────────────────────────────────╢
  3266.        ║Subroutinen:     ATTRIB,CLOFEN,CREMEM,FREMEM,GETFEN,GETMEM,PUTMEM,   ║
  3267.        ║                 SCREEN                                              ║
  3268.        ╟─────────────────────────────────────────────────────────────────────╢
  3269.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  3270.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  3271.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  3272.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  3273.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  3274.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3275.     
  3276.  
  3277.                                                                       Seite 72
  3278.  
  3279.  
  3280.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  3281.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3282.        ║                 CALL GRPFEN (3,15,15,VSEG,COL,I)                    ║
  3283.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3284.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  3285.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3286.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  3287.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3288.        ║                 RETURN                                              ║
  3289.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  3290.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  3291.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  3292.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  3293.        ║                 File ausgelagert wird. Mit der Subroutine "GETFEN"  ║
  3294.        ║                 wird das gespeicherte Fenster an eine andere        ║
  3295.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  3296.        ║                 Subroutine "GRPFEN" ermöglicht das Verkleinern oder ║
  3297.        ║                 Vergrößern des Fensters auf 15 Zeilen und Spalten.  ║
  3298.        ║                 Die Subroutine "CLOFEN" löscht den das Fenster      ║
  3299.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  3300.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  3301.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  3302.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  3303.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  3304.        ║                 Meldung ausgegeben.                                 ║
  3305.        ╚═════════════════════════════════════════════════════════════════════╝
  3306.     
  3307.  
  3308.                                                                       Seite 73
  3309.  
  3310.  
  3311.        ╔═════════════════════════════════════════════════════════════════════╗
  3312.        ║Beschreibung der Subroutine LOSFEN (NR,ZEICH,COL,VSEG,FLAG)          ║
  3313.        ║Die Subroutine überschreibt das Bildschirmfenster mit der Nummer "NR"║
  3314.        ║mit dem in "ZEICH" übergebenen Zeichen. Hintergrund- und Vordergrund-║
  3315.        ║farben werden mit "COL" gesetzt, oder es werden die aktuellen Farben ║
  3316.        ║benutzt, wenn "COL" Null ist. Informationen über die Fensterform     ║
  3317.        ║und die Adresse an der es gespeichert ist, werden automatisch im     ║
  3318.        ║Verwaltungsfeld, das sich ebenfalls in der Memory befindet, abgelegt.║
  3319.        ║Die Adresse des Verwaltungsfeldes wird in "VSEG" übergeben. Die      ║
  3320.        ║Adresse wird für alle Zugriffe auf bis zu 30 im Verwaltungsfeld      ║
  3321.        ║definierte Fenster benötigt. Die Nummer des zu umrahmenden           ║
  3322.        ║Bildschirmfensters stellt die Priorität gegenüber anderen Fenstern   ║
  3323.        ║dar. Sie wird in der Variablen "NR" übergeben. Das zu überschreibende║
  3324.        ║Bildschirmfenster muß bereits in der Memory vorhanden sein. Es muß   ║
  3325.        ║sich aber nicht auf dem Bildschirm befinden. Bei erfolgreicher       ║
  3326.        ║Beendigung der Routine ist in "FLAG" eine Null, sonst eine Eins.     ║
  3327.        ╟─────────────────────────────────────────────────────────────────────╢
  3328.        ║Parameter:                                                           ║
  3329.        ║INTEGER          Nummer des zu umrahmenden Bildschirmfensters        ║
  3330.        ║                 [ 1 bis 30 ]. Wenn die Nummer noch nicht durch ein  ║
  3331.        ║                 Bildschirmfenster belegt ist, wird die Routine mit  ║
  3332.        ║                 "FLAG" gleich Eins abgebrochen.                     ║
  3333.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3334.        ║                 fenster festgelegt.                                 ║
  3335.        ║INTEGER          ASCII-Code des Zeichens, mit dem überschrieben      ║
  3336.        ║                 werden soll [0 bis 255].                            ║
  3337.        ║INTEGER          Farbattribut für Vorder- und Hintergrundfarben.     ║
  3338.        ║                 siehe Anhang: "Farbattribute". Wenn ein Monochrome- ║
  3339.        ║                 Monitor erkannt wird, erfolgt die Ausgabe im        ║
  3340.        ║                 Schwarz/Weiß-Modus.                                 ║
  3341.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3342.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  3343.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3344.        ║                 Bit 7    : blinken                                  ║
  3345.        ║                 oder 0: es wird das vorhandene Attribut des Fensters║
  3346.        ║                 verwendet.                                          ║
  3347.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3348.        ║INTEGER          Return: Fehlerflag                                  ║
  3349.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3350.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3351.        ╟─────────────────────────────────────────────────────────────────────╢
  3352.        ║Subroutinen:     ATTRIB,GETFEN,GETMEM,PUTMEM                         ║
  3353.        ╟─────────────────────────────────────────────────────────────────────╢
  3354.        ║Beispiel:        INTEGER FELD(12),VSEG                               ║
  3355.        ║                 OPEN (1,FILE='TEST',ACCESS='DIRECT',                ║
  3356.        ║                -FORM='FORMATTED',RECL=72,STATUS='OLD')              ║
  3357.        ║                 CALL TEXFEN (2,12,3,20,1,1,23,VSEG,I)               ║
  3358.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3359.        ║                 CALL RAMFEN (2,1,0,'Auswählen: <Esc>','NUM',VSEG,I) ║
  3360.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3361.        ║                 CALL GETFEN (2,5,10,VSEG,I)                         ║
  3362.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3363.        ║                 CALL ME1FEN (2,12,3,FELD,VSEG,I)                    ║
  3364.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3365.        ║                 CALL LOSFEN (2,32,23,VSEG,I)                        ║
  3366.     
  3367.  
  3368.                                                                       Seite 74
  3369.  
  3370.  
  3371.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3372.        ║                 RETURN                                              ║
  3373.        ║               1 WRITE(*,'(1X,A)') 'FEHLER'                          ║
  3374.        ║                 Aus einer direct orgsanisierten Datei mit dem Unit 1║
  3375.        ║                 werden mit Hilfe der Subroutine "TEXFEN" 12 Menü-   ║
  3376.        ║                 texte dreispaltig mit einer jeweiligen Länge von    ║
  3377.        ║                 20 Characters und dem Farbattribut 23 im Fenster    ║
  3378.        ║                 Nummer 2 abgelegt.                                  ║
  3379.        ║                 Die Subroutine "RAMFEN" umgibt das Menüfeld im      ║
  3380.        ║                 Fenster mit einen einfachen Rahmen und schreibt in  ║
  3381.        ║                 die erste Zeile des Fensters eine Meldung. In die   ║
  3382.        ║                 letzte Zeile des Fensters wird außerdem die Nummer  ║
  3383.        ║                 des Fensters eingeblendet. Rahmen und Texte werden  ║
  3384.        ║                 in der vorhandenen Farbe dargestellt.               ║
  3385.        ║                 Die Subroutine "GETFEN" öffnet das Fenster mit dem  ║
  3386.        ║                 Menütext am Bildschirm ab der 5. Zeile und der 10.  ║
  3387.        ║                 Spalte.                                             ║
  3388.        ║                 "ME1FEN" ermöglicht die Auswahl eines einzelnen     ║
  3389.        ║                 Menüpunktes mit Hilfe der Cursortasten und der      ║
  3390.        ║                 <Escape>-Taste.                                     ║
  3391.        ║                 "LOSFEN" überschreibt anschließend das Bildschirm-  ║
  3392.        ║                 fenster mit Blancs. Der Hintergrund wird dabei blau ║
  3393.        ║                 gesetzt.                                            ║
  3394.        ║                 Wenn in einer Subroutine ein Fehler auftritt, wird  ║
  3395.        ║                 eine Fehlermeldung ausgegeben.                      ║
  3396.        ╚═════════════════════════════════════════════════════════════════════╝
  3397.     
  3398.  
  3399.                                                                       Seite 75
  3400.  
  3401.  
  3402.        ╔═════════════════════════════════════════════════════════════════════╗
  3403.        ║Beschreibung der Subroutine RAMFEN (NR,ART,COL,TEXTO,TEXTU,VSEG,FLAG)║
  3404.        ║Die Subroutine unschließt das Bildschirmfenster mit der Nummer "NR"  ║
  3405.        ║mit einen Rahmen, dessen Form in "ART" übergeben wird. In dem        ║
  3406.        ║Characterstring "TEXTO" kann eine Meldung für die erste Zeile, in    ║
  3407.        ║"TEXTU" für die letzte Zeile des Bildschirmfensters übergeben werden.║
  3408.        ║Es ist möglich, in der letzten Zeile die Nummer des Fensters         ║
  3409.        ║einzublenden oder auf die Meldungen zu verzichten. Mit Hilfe der     ║
  3410.        ║Variablen "COL" kann eine neue Farbe oder das im Fenster vorhandene  ║
  3411.        ║Farbattribut gewählt werden. Informationen über die Form des Fensters║
  3412.        ║und die Adresse an der es gespeichert ist, werden automatisch im     ║
  3413.        ║Verwaltungsfeld, das sich ebenfalls in der Memory befindet, abgelegt.║
  3414.        ║Die Adresse des Verwaltungsfeldes wird in "VSEG" übergeben. Die      ║
  3415.        ║Adresse wird für alle Zugriffe auf bis zu 30 im Verwaltungsfeld      ║
  3416.        ║definierte Fenster benötigt. Die Nummer des zu umrahmenden           ║
  3417.        ║Bildschirmfensters stellt die Priorität gegenüber anderen Fenstern   ║
  3418.        ║dar. Sie wird in der Variablen "NR" übergeben. Das zu umrahmende     ║
  3419.        ║Bildschirmfenster muß bereits in der Memory vorhanden sein. Es muß   ║
  3420.        ║sich aber nicht auf dem Bildschirm befinden. Bei erfolgreicher       ║
  3421.        ║Beendigung der Routine ist in "FLAG" eine Null, sonst eine Eins.     ║
  3422.        ╟─────────────────────────────────────────────────────────────────────╢
  3423.        ║Parameter:                                                           ║
  3424.        ║INTEGER          Nummer des zu umrahmenden Bildschirmfensters        ║
  3425.        ║                 [ 1 bis 30 ]. Wenn die Nummer noch nicht durch ein  ║
  3426.        ║                 Bildschirmfenster belegt ist, wird die Routine mit  ║
  3427.        ║                 "FLAG" gleich Eins abgebrochen.                     ║
  3428.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3429.        ║                 fenster festgelegt.                                 ║
  3430.        ║INTEGER          Art der Rahmenzeichnung:                            ║
  3431.        ║                 0:   keinen Rahmen zeichnen                         ║
  3432.        ║                 1:   ┌───────                                       ║
  3433.        ║                 2:   ╔═══════                                       ║
  3434.        ║                 3:   ████████                                       ║
  3435.        ║                 4:   ********                                       ║
  3436.        ║INTEGER          Farbattribut für den Rahmen und die Texte;          ║
  3437.        ║                 siehe Anhang: "Farbattribute". Wenn ein Monochrome- ║
  3438.        ║                 Monitor erkannt wird, erfolgt die Ausgabe im        ║
  3439.        ║                 Schwarz/Weiß-Modus.                                 ║
  3440.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3441.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  3442.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3443.        ║                 Bit 7    : blinken                                  ║
  3444.        ║CHARACTERSTRING  Text, der zentriert in die obere Fensterzeile       ║
  3445.        ║                 geschrieben werden soll, oder CHAR(0) wenn kein Text║
  3446.        ║                 in die obere Fensterzeile geschrieben werden soll.  ║
  3447.        ║CHARACTERSTRING  Text, der zentriert in die untere Fensterzeile      ║
  3448.        ║                 geschrieben werden soll, oder CHAR(0) wenn kein Text║
  3449.        ║                 in die untere Fensterzeile geschrieben werden soll, ║
  3450.        ║                 oder 'NUM' zum Schreiben der Fensternummer in die   ║
  3451.        ║                 untere Fensterzeile.                                ║
  3452.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3453.        ║INTEGER          Return: Fehlerflag                                  ║
  3454.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3455.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3456.        ╟─────────────────────────────────────────────────────────────────────╢
  3457.     
  3458.  
  3459.                                                                       Seite 76
  3460.  
  3461.  
  3462.        ║Subroutinen:     ATTRIB,GETFEN,GETMEM,LAENGE,PUTMEM,UPCASE           ║
  3463.        ╟─────────────────────────────────────────────────────────────────────╢
  3464.        ║Beispiel:        INTEGER FELD(12),VSEG                               ║
  3465.        ║                 OPEN (1,FILE='TEST',ACCESS='DIRECT',                ║
  3466.        ║                -FORM='FORMATTED',RECL=72,STATUS='OLD')              ║
  3467.        ║                 CALL TEXFEN (2,12,3,20,1,1,23,VSEG,I)               ║
  3468.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3469.        ║                 CALL RAMFEN (2,1,0,'Auswählen: <Esc>','NUM',VSEG,I) ║
  3470.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3471.        ║                 CALL GETFEN (2,5,10,VSEG,I)                         ║
  3472.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3473.        ║                 CALL ME1FEN (2,12,3,FELD,VSEG,I)                    ║
  3474.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3475.        ║                 RETURN                                              ║
  3476.        ║               1 WRITE(*,'(1X,A)') 'FEHLER'                          ║
  3477.        ║                 Aus einer direct orgsanisierten Datei mit dem Unit 1║
  3478.        ║                 werden mit Hilfe der Subroutine "TEXFEN" 12 Menü-   ║
  3479.        ║                 texte dreispaltig mit einer jeweiligen Länge von    ║
  3480.        ║                 20 Characters und dem Farbattribut 23 im Fenster    ║
  3481.        ║                 Nummer 2 abgelegt.                                  ║
  3482.        ║                 Die Subroutine "RAMFEN" umgibt das Menüfeld im      ║
  3483.        ║                 Fenster mit einen einfachen Rahmen und schreibt in  ║
  3484.        ║                 die erste Zeile des Fensters eine Meldung. In die   ║
  3485.        ║                 letzte Zeile des Fensters wird außerdem die Nummer  ║
  3486.        ║                 des Fensters eingeblendet. Rahmen und Texte werden  ║
  3487.        ║                 in der vorhandenen Farbe dargestellt.               ║
  3488.        ║                 Die Subroutine "GETFEN" öffnet das Fenster mit dem  ║
  3489.        ║                 Menütext am Bildschirm ab der 5. Zeile und der 10.  ║
  3490.        ║                 Spalte.                                             ║
  3491.        ║                 "ME1FEN" ermöglicht die Auswahl eines einzelnen     ║
  3492.        ║                 Menüpunktes mit Hilfe der Cursortasten und der      ║
  3493.        ║                 <Escape>-Taste. Das der Auswahl entsprechende       ║
  3494.        ║                 Äquivalent in "FELD" wird dadurch ungleich Null     ║
  3495.        ║                 gesetzt. Es ist zu beachten, daß die Anzahl der     ║
  3496.        ║                 Menüpunkte und die Menüspaltenzahl in den Routinen  ║
  3497.        ║                 "TEXFEN" und "ME1FEN" übereinstimmen.               ║
  3498.        ║                 Wenn in einer Subroutine ein Fehler auftritt, wird  ║
  3499.        ║                 eine Fehlermeldung ausgegeben.                      ║
  3500.        ╚═════════════════════════════════════════════════════════════════════╝
  3501.     
  3502.  
  3503.                                                                       Seite 77
  3504.  
  3505.  
  3506.        ╔═════════════════════════════════════════════════════════════════════╗
  3507.        ║Beschreibung der Subroutine WRIFEN (NR,VSEG,FLAG)                    ║
  3508.        ║Die Subroutine schreibt ein am Bildschirm vorhandenes Fenster        ║
  3509.        ║vorübergehend mit höchster Priorität an der gleichen Position auf den║
  3510.        ║Bildschirm. Das Fenster kann mit beliebigem Text beschrieben werden. ║
  3511.        ║Der Text wird mit Hilfe des Cursorblocks im Fenster positioniert.    ║
  3512.        ║Nachdem das Beschreiben des Fensters mit der <Escape>-Taste beendet  ║
  3513.        ║worden ist, wird das Fenster mit der ursprünglichen Priorität        ║
  3514.        ║zwischen den restlichen offenen Fenstern eingeordnet. Informationen  ║
  3515.        ║über die Ausmaße des Bildschirmfensters und über die Adresse an der  ║
  3516.        ║es gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das║
  3517.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  3518.        ║Adresse des Verwaltungsfeldes übergeben. Die Adresse wird für alle   ║
  3519.        ║Zugriffe auf bis zu 30 im Verwaltungsfeld definierte Fenster         ║
  3520.        ║benötigt. Die Nummer des darzustellenden Bildschirmfensters stellt   ║
  3521.        ║die Priorität gegenüber anderen Fensters dar. Sie wird in der        ║
  3522.        ║Variablen "NR" übergeben. Ein vorhandener Bildschirmrahmen wird nicht║
  3523.        ║überschrieben. Bei erfolgreicher Beendigung der Routine ist in "Flag"║
  3524.        ║eine Null, sonst eine Eins.                                          ║
  3525.        ╟─────────────────────────────────────────────────────────────────────╢
  3526.        ║Parameter:                                                           ║
  3527.        ║INTEGER          Nummer des mit Text zu beschreibenden Bildschirm-   ║
  3528.        ║                 fensters [ 1 bis 30 ]. Wenn die Nummer noch nicht   ║
  3529.        ║                 durch ein Bildschirmfenster belegt ist, wird die    ║
  3530.        ║                 Routine mit "FLAG" gleich Eins abgebrochen.         ║
  3531.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3532.        ║                 fenster festgelegt.                                 ║
  3533.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3534.        ║INTEGER          Return: Fehlerflag                                  ║
  3535.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3536.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3537.        ╟─────────────────────────────────────────────────────────────────────╢
  3538.        ║Subroutinen:     AREAD,FREFEN,GETFEN,GETMEM,PUTFEN,PUTMEM,SCREEN     ║
  3539.        ╟─────────────────────────────────────────────────────────────────────╢
  3540.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  3541.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  3542.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  3543.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  3544.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  3545.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3546.        ║                 CALL WRIFEN (3,VSEG,I)                              ║
  3547.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3548.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  3549.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3550.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  3551.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3552.        ║                 RETURN                                              ║
  3553.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  3554.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  3555.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  3556.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  3557.        ║                 File ausgelagert wird. Mit der Subroutine "WRIFEN"  ║
  3558.        ║                 wird das gespeicherte Fenster am Bildschirm mit Text║
  3559.        ║                 beschrieben und in die Memory zurückgeschrieben. Die║
  3560.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  3561.     
  3562.  
  3563.                                                                       Seite 78
  3564.  
  3565.  
  3566.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  3567.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  3568.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  3569.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  3570.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  3571.        ║                 Meldung ausgegeben.                                 ║
  3572.        ╚═════════════════════════════════════════════════════════════════════╝
  3573.     
  3574.  
  3575.                                                                       Seite 79
  3576.  
  3577.  
  3578.        ╔═════════════════════════════════════════════════════════════════════╗
  3579.        ║Beschreibung der Subroutine ME1FEN (NR,ANZ,SPZ,FELD,VSEG,COL,FLAG)   ║
  3580.        ║Die Subroutine schreibt ein schon vorher geöffnetes Fenster          ║
  3581.        ║vorübergehend mit höchster Priorität an der gleichen Position auf den║
  3582.        ║Bildschirm. Mit den Cursortasten kann ein Menüfeld angefahren und mit║
  3583.        ║der <Escape>- oder <Return>-Taste ausgewählt werden. In "COL" wird   ║
  3584.        ║das Farbattribut für die Menüfelder übergeben. Wenn "COL" eine Null  ║
  3585.        ║enthält, wird die aktuelle Farbe aus dem ersten Menüfeld übernommen. ║
  3586.        ║Mit einer Eins wird die Farbe des Rahmens übernommen. Das jeweils    ║
  3587.        ║aktuelle Menüfeld wird mit intensivierter Farbe angezeigt. Das dem   ║
  3588.        ║gewähltem Menüfeld entsprechende Element des Feldes "FELD" wird      ║
  3589.        ║gesetzt, alle anderen Feldelemente enthalten eine Null. Die Anzahl   ║
  3590.        ║der Menüfelder wird mit "ANZ" bestimmt. Die Subroutine vermindert die║
  3591.        ║Anzahl der berücksichtigten Feldelemente automatisch, wenn die       ║
  3592.        ║Ausmaße des Fensters nicht ausreichen. In "SPZ" wird die Anzahl der  ║
  3593.        ║Menüspalten festgelegt. Der Menütext muß vor dem Aufruf der Routine  ║
  3594.        ║bereits im Fenster vorhanden sein. Dafür eignet sich die Routine     ║
  3595.        ║"TEXFEN", die Texte aus einer Datei in einem Fenster positioniert.   ║
  3596.        ║Nachdem die Auswahl eines Menüpunktes <Escape> oder <Return> beendet ║
  3597.        ║worden ist, wird das Fenster mit der ursprünglichen Priorität        ║
  3598.        ║zwischen den restlichen offenen Fenstern eingeordnet. Informationen  ║
  3599.        ║über die Ausmaße des Bildschirmfensters und über die Adresse an der  ║
  3600.        ║es gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das║
  3601.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  3602.        ║Adresse des Verwaltungsfeldes, das vorher mit Hilfe anderer Fenster- ║
  3603.        ║routinen angelegt worden ist, übergeben. Die Adresse wird für alle   ║
  3604.        ║Zugriffe auf bis zu 30 im Verwaltungsfeld definierte Fenster         ║
  3605.        ║benötigt. Die Nummer des darzustellenden Bildschirmfensters stellt   ║
  3606.        ║die Priorität gegenüber anderen Fensters dar. Sie wird in der        ║
  3607.        ║Variablen "NR" übergeben. Bei erfolgreicher Beendigung der Routine   ║
  3608.        ║ist in "FLAG" eine Null, sonst eine Eins.                            ║
  3609.        ╟─────────────────────────────────────────────────────────────────────╢
  3610.        ║Parameter:                                                           ║
  3611.        ║INTEGER          Nummer des zur Menüauswahl bestimmten Bildschirm-   ║
  3612.        ║                 fensters [ 1 bis 30 ]. Wenn die Nummer noch nicht   ║
  3613.        ║                 durch ein Bildschirmfenster belegt ist, wird die    ║
  3614.        ║                 Routine mit "FLAG" gleich Eins abgebrochen.         ║
  3615.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3616.        ║                 fenster festgelegt.                                 ║
  3617.        ║INTEGER          Anzahl der gewünschten Mneüfelder.                  ║
  3618.        ║                 Return: Anzahl der tatsächlichen Menüfelder, wenn   ║
  3619.        ║                 die Größe des Menüfensters nicht ausreicht.         ║
  3620.        ║INTEGER          Anzahl der nebeneinander angeordneten Menüfelder im ║
  3621.        ║                 Bildschirmfenster.                                  ║
  3622.        ║INTEGERFELD      Return: Feld der Form [ FELD(ANZ) ]                 ║
  3623.        ║                 Das Feldelement des äquivalenten Menüfeldes, das mit║
  3624.        ║                 <Escape> oder <Return> ausgewählt wurde, entspricht ║
  3625.        ║                 der Nummer des Menüfeldes, die restlichen           ║
  3626.        ║                 Feldelemente werden Null gesetzt.                   ║
  3627.        ║INTEGER          Adresse des Verwaltungsfeldes                       ║
  3628.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  3629.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  3630.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  3631.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3632.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  3633.     
  3634.  
  3635.                                                                       Seite 80
  3636.  
  3637.  
  3638.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3639.        ║                 Bit 7    : blinken                                  ║
  3640.        ║                 oder:                                               ║
  3641.        ║                 0: Übernahme der Farbe aus dem ersten Menüfeld      ║
  3642.        ║                 oder:                                               ║
  3643.        ║                 1: Übernahme der Rahmenfarbe für die Menüfelder     ║
  3644.        ║INTEGER          Return: Fehlerflag                                  ║
  3645.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3646.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3647.        ╟─────────────────────────────────────────────────────────────────────╢
  3648.        ║Subroutinen:     ATTRIB,CTBUF,GETFEN,GETMEM,PUTMEM,SCREEN,TAST       ║
  3649.        ╟─────────────────────────────────────────────────────────────────────╢
  3650.        ║Beispiel:        INTEGER FELD(12),VSEG                               ║
  3651.        ║                 OPEN (1,FILE='TEST',ACCESS='DIRECT',                ║
  3652.        ║                -FORM='FORMATTED',RECL=72,STATUS='OLD')              ║
  3653.        ║                 CALL TEXFEN (2,12,3,20,1,1,23,VSEG,I)               ║
  3654.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3655.        ║                 CALL RAMFEN (2,1,0,'Auswählen: <Esc>',VSEG,I)       ║
  3656.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3657.        ║                 CALL GETFEN (2,5,10,VSEG,I)                         ║
  3658.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3659.        ║                 CALL ME1FEN (2,12,3,FELD,VSEG,I)                    ║
  3660.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3661.        ║                 RETURN                                              ║
  3662.        ║               1 WRITE(*,'(1X,A)') 'FEHLER'                          ║
  3663.        ║                 Aus einer direct orgsanisierten Datei mit dem Unit 1║
  3664.        ║                 werden mit Hilfe der Subroutine "TEXFEN" 12 Menü-   ║
  3665.        ║                 texte dreispaltig mit einer jeweiligen Länge von    ║
  3666.        ║                 20 Characters und dem Farbattribut 23 im Fenster    ║
  3667.        ║                 Nummer 2 abgelegt.                                  ║
  3668.        ║                 Die Subroutine "RAMFEN" umgibt das Menüfeld im      ║
  3669.        ║                 Fenster mit einen einfachen Rahmen und schreibt in  ║
  3670.        ║                 die erste Zeile des Fensters eine Meldung. Dazu wird║
  3671.        ║                 das vorhandene Farbattribut benutzt.                ║
  3672.        ║                 Die Subroutine "GETFEN" öffnet das Fenster mit dem  ║
  3673.        ║                 Menütext am Bildschirm ab der 5. Zeile und der 10.  ║
  3674.        ║                 Spalte.                                             ║
  3675.        ║                 "ME1FEN" ermöglicht die Auswahl eines einzelnen     ║
  3676.        ║                 Menüpunktes mit Hilfe der Cursortasten und der      ║
  3677.        ║                 <Escape>-Taste. Das der Auswahl entsprechende       ║
  3678.        ║                 Äquivalent in "FELD" wird dadurch ungleich Null     ║
  3679.        ║                 gesetzt. Es ist zu beachten, daß die Anzahl der     ║
  3680.        ║                 Menüpunkte und die Menüspaltenzahl in den Routinen  ║
  3681.        ║                 "TEXFEN" und "ME1FEN" übereinstimmen.               ║
  3682.        ║                 Wenn in einer Subroutine ein Fehler auftritt, wird  ║
  3683.        ║                 eine Fehlermeldung ausgegeben.                      ║
  3684.        ╚═════════════════════════════════════════════════════════════════════╝
  3685.     
  3686.  
  3687.                                                                       Seite 81
  3688.  
  3689.  
  3690.        ╔═════════════════════════════════════════════════════════════════════╗
  3691.        ║Beschreibung der Subroutine MENFEN (NR,ANZ,SPZ,FELD,VSEG,COL,FLAG)   ║
  3692.        ║Die Subroutine schreibt ein schon vorher geöffnetes Fenster          ║
  3693.        ║vorübergehend mit höchster Priorität an der gleichen Position auf den║
  3694.        ║Bildschirm. Mit Hilfe der Cursortasten kann zwischen den Menüpunkten ║
  3695.        ║gewechselt werden. In "COL" wird das Farbattribut für die Menüfelder ║
  3696.        ║übergeben. Wenn "COL" eine Null enthält, wird die aktuelle Farbe aus ║
  3697.        ║dem ersten Menüfeld übernommen. Mit einer Eins wird die Farbe des    ║
  3698.        ║Rahmens übernommen. Der jeweils aktuelle Menüpunkt wird mit          ║
  3699.        ║intensivierter Farbe angezeigt. Die <F1>-Taste ermöglicht die Auswahl║
  3700.        ║eines oder mehrerer Menüpunkte. Ausgewählte Menüpunkte werden inverse║
  3701.        ║auf dem Bildschirm dargestellt. Mit der <F2>-Taste ist es möglich,   ║
  3702.        ║bereits gewählte Menüpunkte wieder rückgängig zu machen. Mit <Escape>║
  3703.        ║oder <Return> wird die Subroutine beendet. Die den gewählten         ║
  3704.        ║Menüpunkten entsprechenden Feldelemente des Feldes "FELD" werden     ║
  3705.        ║gesetzt, alle anderen Feldelemente enthalten eine Null. Die Anzahl   ║
  3706.        ║der Menüpunkte wird mit "ANZ" bestimmt. Die Subroutine vermindert die║
  3707.        ║Anzahl der berücksichtigten Feldelemente automatisch, wenn die       ║
  3708.        ║Ausmaße des Fensters nicht ausreichen. In "SPZ" wird die Anzahl der  ║
  3709.        ║Menüspalten festgelegt. Der Menütext muß vor dem Aufruf der Routine  ║
  3710.        ║bereits im Fenster vorhanden sein. Dafür eignet sich die Routine     ║
  3711.        ║"TEXFEN", die Texte aus einer Datei in einem Fenster positioniert.   ║
  3712.        ║Nachdem die Auswahl eines Menüpunktes mit <Escape> oder <Return>     ║
  3713.        ║beendet worden ist, wird das Fenster mit der ursprünglichen Priorität║
  3714.        ║zwischen den restlichen offenen Fenstern eingeordnet. Informationen  ║
  3715.        ║über die Ausmaße des Bildschirmfensters und über die Adresse an der  ║
  3716.        ║es gespeichert ist, werden automatisch aus einem Verwaltungsfeld, das║
  3717.        ║sich ebenfalls in der Memory befindet, gelesen. In "VSEG" wird die   ║
  3718.        ║Adresse des Verwaltungsfeldes, das vorher mit Hilfe anderer Fenster- ║
  3719.        ║routinen angelegt worden ist, übergeben. Die Adresse wird für alle   ║
  3720.        ║Zugriffe auf bis zu 30 im Verwaltungsfeld definierte Fenster         ║
  3721.        ║benötigt. Die Nummer des darzustellenden Bildschirmfensters stellt   ║
  3722.        ║die Priorität gegenüber anderen Fensters dar. Sie wird in der        ║
  3723.        ║Variablen "NR" übergeben. Bei erfolgreicher Beendigung der Routine   ║
  3724.        ║ist in "FLAG" eine Null, sonst eine Eins.                            ║
  3725.        ╟─────────────────────────────────────────────────────────────────────╢
  3726.        ║Parameter:                                                           ║
  3727.        ║INTEGER          Nummer des zur Menüauswahl bestimmten Bildschirm-   ║
  3728.        ║                 fensters [ 1 bis 30 ]. Wenn die Nummer noch nicht   ║
  3729.        ║                 durch ein Bildschirmfenster belegt ist, wird die    ║
  3730.        ║                 Routine mit "FLAG" gleich Eins abgebrochen.         ║
  3731.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3732.        ║                 fenster festgelegt.                                 ║
  3733.        ║INTEGER          Anzahl der gewünschten Mneüfelder.                  ║
  3734.        ║                 Return: Anzahl der tatsächlichen Menüfelder, wenn   ║
  3735.        ║                 die Größe des Menüfensters nicht ausreicht.         ║
  3736.        ║INTEGER          Anzahl der nebeneinander angeordneten Menüfelder im ║
  3737.        ║                 Bildschirmfenster.                                  ║
  3738.        ║INTEGERFELD      Return: Feld der Form [ FELD(ANZ) ]                 ║
  3739.        ║                 Die Feldelemente der äquivalenten Menüfelder, die   ║
  3740.        ║                 mit der <F1>-Taste ausgewählt wurden, entsprechen   ║
  3741.        ║                 den Nummern der Menüfelder, die restlichen          ║
  3742.        ║                 Feldelemente werden Null gesetzt.                   ║
  3743.        ║INTEGER          Adresse des Verwaltungsfeldes                       ║
  3744.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  3745.     
  3746.  
  3747.                                                                       Seite 82
  3748.  
  3749.  
  3750.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  3751.        ║                 Ausgabe im Schwarz/weiß-Modus.                      ║
  3752.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3753.        ║                 Bit 3    : Intensität der Vordergundfarbe           ║
  3754.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3755.        ║                 Bit 7    : blinken                                  ║
  3756.        ║                 oder:                                               ║
  3757.        ║                 0: Übernahme der Farbe aus dem ersten Menüfeld      ║
  3758.        ║                 oder:                                               ║
  3759.        ║                 1: Übernahme der Rahmenfarbe für die Menüfelder     ║
  3760.        ║INTEGER          Return: Fehlerflag                                  ║
  3761.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3762.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3763.        ╟─────────────────────────────────────────────────────────────────────╢
  3764.        ║Subroutinen:     ATTRIB,CTBUF,GETFEN,GETMEM,PUTMEM,SCREEN,TAST       ║
  3765.        ╟─────────────────────────────────────────────────────────────────────╢
  3766.        ║Beispiel:        INTEGER FELD(12),VSEG                               ║
  3767.        ║                 OPEN (1,FILE='TEST',ACCESS='DIRECT',                ║
  3768.        ║                -FORM='FORMATTED',RECL=72,STATUS='OLD')              ║
  3769.        ║                 CALL TEXFEN (2,12,3,20,1,1,23,VSEG,I)               ║
  3770.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3771.        ║                 CALL RAMFEN (2,1,0,'Auswählen: <Esc>',VSEG,I)       ║
  3772.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3773.        ║                 CALL GETFEN (2,5,10,VSEG,I)                         ║
  3774.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3775.        ║                 CALL MENFEN (2,12,3,FELD,VSEG,I)                    ║
  3776.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3777.        ║                 RETURN                                              ║
  3778.        ║               1 WRITE(*,'(1X,A)') 'FEHLER'                          ║
  3779.        ║                 Aus einer direct orgsanisierten Datei mit dem Unit 1║
  3780.        ║                 werden mit Hilfe der Subroutine "TEXFEN" 12 Menü-   ║
  3781.        ║                 texte dreispaltig mit einer jeweiligen Länge von    ║
  3782.        ║                 20 Characters und dem Farbattribut 23 im Fenster    ║
  3783.        ║                 Nummer 2 abgelegt.                                  ║
  3784.        ║                 Die Subroutine "RAMFEN" umgibt das Menüfeld im      ║
  3785.        ║                 Fenster mit einen einfachen Rahmen und schreibt in  ║
  3786.        ║                 die erste Zeile des Fensters eine Meldung. Dazu wird║
  3787.        ║                 das vorhandene Farbattribut benutzt.                ║
  3788.        ║                 Die Subroutine "GETFEN" öffnet das Fenster mit dem  ║
  3789.        ║                 Menütext am Bildschirm ab der 5. Zeile und der 10.  ║
  3790.        ║                 Spalte.                                             ║
  3791.        ║                 "MENFEN" ermöglicht die Auswahl eines oder mehrerer ║
  3792.        ║                 Menüpunkte mit Hilfe der Cursor-, F1-, F2- <Return>-║
  3793.        ║                 und <Escape>-Tasten. Die der Auswahl entsprechenden ║
  3794.        ║                 Äquivalente in "FELD" werden dadurch ungleich Null  ║
  3795.        ║                 gesetzt. Es ist zu beachten, daß die Anzahl der     ║
  3796.        ║                 Menüpunkte und die Menüspaltenzahl in den Routinen  ║
  3797.        ║                 "TEXFEN" und "MENFEN" übereinstimmen.               ║
  3798.        ║                 Wenn in einer Subroutine ein Fehler auftritt, wird  ║
  3799.        ║                 eine Fehlermeldung ausgegeben.                      ║
  3800.        ╚═════════════════════════════════════════════════════════════════════╝
  3801.     
  3802.  
  3803.                                                                       Seite 83
  3804.  
  3805.  
  3806.        ╔═════════════════════════════════════════════════════════════════════╗
  3807.        ║Beschreibung der Subroutine VERFEN (VSEG,COL,FLAG)                   ║
  3808.        ║Die Subroutine eröffnet ein Verwaltungsfenster am Bildschirm, mit    ║
  3809.        ║dessen Hilfe bis zu 28 existierende Fenster cursorgesteuert am Bild- ║
  3810.        ║schirm verwaltet werden können. Es wird ein Fenster mit dem aktuellen║
  3811.        ║Bildschirminhalt in der niedrigsten Prioritätsstufe angelegt. Die    ║
  3812.        ║höchste Prioritätsstufe erhält das Verwaltungsfenster. Nach dem      ║
  3813.        ║Beenden der Subroutine wird das Verwaltungsfenster geschlossen. Die  ║
  3814.        ║Fenster mit den Nummern 1 und 30 dürfen nicht existieren; zu         ║
  3815.        ║verwaltende Fenster müssen bereits existieren. Es können Fenster     ║
  3816.        ║mitverwaltet werden, die bereits vor dem Aufruf der Subroutine auf   ║
  3817.        ║dem Bildschirm vorhanden sind. Wegen möglicher Farbdiskrepanzen wird ║
  3818.        ║aber empfohlen, alle geöffneten Fenster vorher zu schließen. In      ║
  3819.        ║"COL" wird ein Farbattribut für eventuell freiwerdenden Hintergrund  ║
  3820.        ║und für zu beschreibenden Vordergrund an die Routine übergeben.      ║
  3821.        ║"VSEG" enthält die Adresse des Verwaltungsfeldes, in dem sich alle   ║
  3822.        ║aktuellen Informationen über die existierenden Fenster befinden.     ║
  3823.        ║Es können die folgenden Verwaltungsarten durchführt werden:          ║
  3824.        ║1. Öffnen eines Fensters                                             ║
  3825.        ║2. Bewegen eines Fensters                                            ║
  3826.        ║3. Beschreiben eines Fensters mit Text                               ║
  3827.        ║4. Inhalt eines Fensters löschen                                     ║
  3828.        ║5. Umrahmen eines Fensters und Ausgabe der Fensternummer             ║
  3829.        ║6. Vergrößern oder verkleinern eines Fensters                        ║
  3830.        ║7. Schließen eines Fensters                                          ║
  3831.        ║8. Freigeben eines Fensters                                          ║
  3832.        ║Fenstermanipulationen, die nicht möglich sind, werden akustisch      ║
  3833.        ║angezeigt. Nach dem Abschluß der Fensterverwaltung bleibt die        ║
  3834.        ║aktuelle Konfiguration zur weiteren Bearbeitung am Bildschirm        ║
  3835.        ║vorhanden. Bei erfolgreicher Beendigung der Subroutine steht in      ║
  3836.        ║"FLAG" eine Null, sonst eine Eins.                                   ║
  3837.        ╟─────────────────────────────────────────────────────────────────────╢
  3838.        ║Parameter:                                                           ║
  3839.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3840.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  3841.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  3842.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  3843.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3844.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  3845.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3846.        ║                 Bit 7    : blinken                                  ║
  3847.        ║INTEGER          Return: Fehlerflag                                  ║
  3848.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3849.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3850.        ╟─────────────────────────────────────────────────────────────────────╢
  3851.        ║Subroutinen:     CLOFEN,FREFEN,GETFEN,GETMEM,IREAD,MAKFEN,MOVFEN,    ║
  3852.        ║                 PIEPS,PUTFEN,RAMFEN,WRIFEN                          ║
  3853.        ╟─────────────────────────────────────────────────────────────────────╢
  3854.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  3855.        ║                 DATA VSEG/0/,COL/23/                                ║
  3856.        ║                 DO 1 I=2,29                                         ║
  3857.        ║                    CALL LOES (5,I+2,5,5,32,COL+I,0)                 ║
  3858.        ║                    CALL PUTFEN (I,5,I+2,5,5,VSEG,J)                 ║
  3859.        ║                    IF (J .NE. 0) GOTO 1                             ║
  3860.        ║               1 CONTINUE                                            ║
  3861.     
  3862.  
  3863.                                                                       Seite 84
  3864.  
  3865.  
  3866.        ║                 CALL VERFEN (VSEG,COL,I)                            ║
  3867.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3868.        ║                 RETURN                                              ║
  3869.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  3870.        ║                 Mit den Subroutinen "LOES" und "PUTFEN" werden      ║
  3871.        ║                 28 Fenster verschiedener Größe und mit verschiedenen║
  3872.        ║                 Farben erzeugt.                                     ║
  3873.        ║                 Die Subroutine "VERFEN" ermöglicht die Verwaltung   ║
  3874.        ║                 der 28 Fenster. Wenn die Subroutine beendet wird,   ║
  3875.        ║                 bleibt der aktuelle Zustand am Bildschirm erhalten. ║
  3876.        ║                 Beim Auftreten eines Fehlers wird eine Meldung      ║
  3877.        ║                 ausgegeben.                                         ║
  3878.        ╚═════════════════════════════════════════════════════════════════════╝
  3879.     
  3880.  
  3881.                                                                       Seite 85
  3882.  
  3883.  
  3884.        ╔═════════════════════════════════════════════════════════════════════╗
  3885.        ║Beschreibung der Subroutine CLOFEN (NR,VSEG,COL,FLAG)                ║
  3886.        ║Die Subroutine schließt ein Fenster am Bildschirm und stellt die     ║
  3887.        ║vorhandenen Bildschirmfenster wieder her. Das Fenster kann mit Hilfe ║
  3888.        ║der Subroutine "GETFEN" jederzeit wieder auf den Bildschirm gebracht ║
  3889.        ║werden. Größen, Positionen und Adressen der vorhandenen Fenster und  ║
  3890.        ║des zu schließenden Fensters werden automatisch aus einem            ║
  3891.        ║Verwaltungsfeld, das sich ebenfalls in der Memory befindet, gelesen. ║
  3892.        ║In "VSEG" wird die Adresse des Verwaltungsfeldes übergeben. Die      ║
  3893.        ║Adresse wird für alle Zugriffe auf bis zu 30 im Verwaltungsfeld      ║
  3894.        ║definierte Fenster durch Fensterroutinen benötigt. Die Nummer des zu ║
  3895.        ║schließenden Fensters wird in der Variablen "NR" übergeben. Sie      ║
  3896.        ║stellt die Priorität des Bildschirmfensters gegenüber anderen        ║
  3897.        ║Fenstern dar. Auf dem Bildschirm vorhandene Fenster werden ihrer     ║
  3898.        ║Priorität entsprechend berücksichtigt. Der Hintergrund kann          ║
  3899.        ║entweder mit dem im Verwaltungsfeld unter der Nummer 1 abgelegten    ║
  3900.        ║Fensterinhalt oder mit einer Hintergrundfarbe "COL" beschrieben      ║
  3901.        ║werden. Bei erfolgreicher Beendigung der Subroutine ist in "FLAG"    ║
  3902.        ║eine Null, sonst eine Eins.                                          ║
  3903.        ╟─────────────────────────────────────────────────────────────────────╢
  3904.        ║Parameter:                                                           ║
  3905.        ║INTEGER          Nummer des am Bildschirm zu schließenden Fensters.  ║
  3906.        ║                 [ 1 bis 30 ]. Wenn die Nummer noch nicht durch ein  ║
  3907.        ║                 Bildschirmfenster belegt ist, wird die Routine mit  ║
  3908.        ║                 "FLAG" gleich Eins abgebrochen.                     ║
  3909.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  3910.        ║                 fenster festgelegt.                                 ║
  3911.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3912.        ║INTEGER          Farbattribut; siehe Anhang: "Farbattribute". Wenn   ║
  3913.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  3914.        ║                 Ausgabe im Schwarz/Weiß-Modus.                      ║
  3915.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  3916.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  3917.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  3918.        ║                 Bit 7    : blinken                                  ║
  3919.        ║                 oder: 0 zum Beschreiben des Hintergrundes mit dem   ║
  3920.        ║                 Inhalt des unter der Nummer 1 abgelegten Fensters.  ║
  3921.        ║INTEGER          Return: Fehlerflag                                  ║
  3922.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3923.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3924.        ╟─────────────────────────────────────────────────────────────────────╢
  3925.        ║Subroutinen:     ATTRIB,GETMEM,PUTMEM,SCREEN                         ║
  3926.        ╟─────────────────────────────────────────────────────────────────────╢
  3927.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  3928.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  3929.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  3930.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  3931.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  3932.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3933.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  3934.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3935.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  3936.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3937.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  3938.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3939.     
  3940.  
  3941.                                                                       Seite 86
  3942.  
  3943.  
  3944.        ║                 RETURN                                              ║
  3945.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  3946.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  3947.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  3948.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  3949.        ║                 File ausgelagert wird. Mit der Subroutine "GETFEN"  ║
  3950.        ║                 wird das gespeicherte Fenster an eine andere        ║
  3951.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  3952.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  3953.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  3954.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  3955.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  3956.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  3957.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  3958.        ║                 Meldung ausgegeben.                                 ║
  3959.        ╚═════════════════════════════════════════════════════════════════════╝
  3960.     
  3961.  
  3962.                                                                       Seite 87
  3963.  
  3964.  
  3965.        ╔═════════════════════════════════════════════════════════════════════╗
  3966.        ║Beschreibung der Subroutine FREFEN (NR,VSEG,FLAG)                    ║
  3967.        ║Die Subroutine gibt den durch ein Bildschirmfenster belegten         ║
  3968.        ║Speicherplatz in der Memory bzw. in einem temporären File wieder frei║
  3969.        ║und entfernt alle Informationen über das Bildschirmfenster aus dem   ║
  3970.        ║Verwaltungsfeld. In "VSEG" wird die Adresse dieses Verwaltungsfeldes ║
  3971.        ║übergeben. Sie wird für alle Zugriffe auf bis zu 30 im Verwaltungs-  ║
  3972.        ║feld definierte Fenster durch Fensterroutinen benötigt. Die Nummer   ║
  3973.        ║des zu löschenden Bildschirmfensters wird in der Variablen "NR"      ║
  3974.        ║übergeben. Bei erfolgreicher Beendigung der Subroutine ist in "FLAG" ║
  3975.        ║eine Null, sonst eine Eins.                                          ║
  3976.        ╟─────────────────────────────────────────────────────────────────────╢
  3977.        ║Parameter:                                                           ║
  3978.        ║INTEGER          Nummer des aus der Memory zu entfernenden Bild-     ║
  3979.        ║                 schirmfensters [ 1 bis 30 ].                        ║
  3980.        ║                 Die Nummer steht für ein neu anzulegendes Bild-     ║
  3981.        ║                 schirmfensters wieder zur Verfügung.                ║
  3982.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  3983.        ║INTEGER          Return: Fehlerflag                                  ║
  3984.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  3985.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  3986.        ╟─────────────────────────────────────────────────────────────────────╢
  3987.        ║Subroutinen:     FREMEM,GETMEM,PUTMEM                                ║
  3988.        ╟─────────────────────────────────────────────────────────────────────╢
  3989.        ║Beispiel:        INTEGER H,B,ZEI,SP,VSEG,COL                         ║
  3990.        ║                 DATA H/10/,B/20/,ZEI/1/,SP/1/,VSEG/0/,COL/23/       ║
  3991.        ║                 CALL LOES (H,B,ZEI,SP,32,COL,0)                     ║
  3992.        ║                 CALL RAHM (H,B,ZEI,SP,0,COL,0)                      ║
  3993.        ║                 CALL PUTFEN (3,H,B,ZEI,SP,VSEG,I)                   ║
  3994.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3995.        ║                 CALL GETFEN (3,11,40,VSEG,I)                        ║
  3996.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3997.        ║                 CALL CLOFEN (3,VSEG,COL,I)                          ║
  3998.        ║                 IF (I .NE. 0) GOTO 1                                ║
  3999.        ║                 CALL FREFEN (3,VSEG,I)                              ║
  4000.        ║                 IF (I .NE. 0) GOTO 1                                ║
  4001.        ║                 RETURN                                              ║
  4002.        ║               1 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  4003.        ║                 Mit den Subroutinen "LOES" und "RAHM" wird ein      ║
  4004.        ║                 Bildschirmfenster aufgebaut, das mit der Subroutine ║
  4005.        ║                 "PUTFEN" in die Memory bzw. in einen temporären     ║
  4006.        ║                 File ausgelagert wird. Mit der Subrouteine "GETFEN" ║
  4007.        ║                 wird das gespeicherte Fenster an eine andere        ║
  4008.        ║                 Position des Bildschirms zurückgeschrieben. Die     ║
  4009.        ║                 Subroutine "CLOFEN" löscht den das Fenster          ║
  4010.        ║                 einnehmenden Bildschirmbereich mit dem Farbattribut ║
  4011.        ║                 "COL" bzw stellt dort vorhandene Fenster wieder her.║
  4012.        ║                 Die Subroutine "FREFEN" gibt den für das Fenster    ║
  4013.        ║                 allokierten Speicherbereich bzw. Filebereich wieder ║
  4014.        ║                 frei. Beim Auftreten eines Fehlers wird eine        ║
  4015.        ║                 Meldung ausgegeben.                                 ║
  4016.        ╚═════════════════════════════════════════════════════════════════════╝
  4017.     
  4018.  
  4019.                                                                       Seite 88
  4020.  
  4021.  
  4022.        ╔═════════════════════════════════════════════════════════════════════╗
  4023.        ║Beschreibung der Subroutine INFFEN (NR,H,B,ZEI,SP,OP,SEG,VSEG,FLAG)  ║
  4024.        ║Die Subroutine gibt die aktuellen Parameter eines Fensters mit der   ║
  4025.        ║Nummer "NR" an das rufende Programm zurück. Die Informationen werden ║
  4026.        ║aus einem Verwaltungsfeld gelesen, das sich in der Memory befindet.  ║
  4027.        ║In "H" und "B" werden die Höhe und die Breite des Fensters zurück-   ║
  4028.        ║gegeben. "ZEI" und "SP" bezeichnen die Zeile und Spalte in der das   ║
  4029.        ║Fenster bei der Bildschirmdarstellung beginnt. "OP" ist ein Indikator║
  4030.        ║für das Vorhandensein eines Fensters am Bildschirm. Wenn "OP" Null   ║
  4031.        ║ist, ist das betreffende Fenster geschlossen. In "SEG" steht die     ║
  4032.        ║Adresse, an der der Fensterinhalt gespeichert ist. Wenn "SEG"        ║
  4033.        ║positiv ist, handelt es sich um eine Segmentadresse in der Memory.   ║
  4034.        ║Eine negative Zahl bezeichnet die Satznummer in einer direct         ║
  4035.        ║organisierten temporären Datei mit dem Unit 100, wenn in der Memory  ║
  4036.        ║kein Speicherplatz für den Fensterinhalt zur Verfügung stand. Wenn   ║
  4037.        ║das Fenster noch nicht existiert, steht in "SEG" eine Null. "VSEG"   ║
  4038.        ║beinhaltet die Adresse des Verwaltungsfeldes, in dem aktuelle        ║
  4039.        ║Informationen für bis zu 30 Bildschirmfenster gespeichert sind. In   ║
  4040.        ║der Variablen "FLAG" wird bei erfolgreicher Beendigung der Subroutine║
  4041.        ║eine Null übergeben, sonst eine Eins.                                ║
  4042.        ╟─────────────────────────────────────────────────────────────────────╢
  4043.        ║Parameter:                                                           ║
  4044.        ║INTEGER          Nummer des zu umrahmenden Bildschirmfensters        ║
  4045.        ║                 [ 1 bis 30 ]. Wenn die Nummer noch nicht durch ein  ║
  4046.        ║                 Bildschirmfenster belegt ist, wird die Routine mit  ║
  4047.        ║                 "FLAG" gleich Eins abgebrochen.                     ║
  4048.        ║                 Durch die Nummer ist die Hirarchie der Bildschirm-  ║
  4049.        ║                 fenster festgelegt.                                 ║
  4050.        ║INTEGER          Return: Höhe des Bildschirmfensters in Zeilen.      ║
  4051.        ║INTEGER          Return: Breite des Bildschirmfensters in Spalten    ║
  4052.        ║INTEGER          Return: Erste Bildschirmzeile des Fensters.         ║
  4053.        ║INTEGER          Return: Erste Bildschirmspalte des Fensters.        ║
  4054.        ║INTEGER          Return: Indikator für das Vorhandensein des Fensters║
  4055.        ║                         am Bildschirm.                              ║
  4056.        ║                         0: Fenster nicht am Bildschirm vorhanden    ║
  4057.        ║                         1: Fenster am Bildschirm vorhanden          ║
  4058.        ║INTEGER          Return: Adresse an der der Fensterinhalt gespeichert║
  4059.        ║                         ist.                                        ║
  4060.        ║                         Positiv: Segment in der Memory              ║
  4061.        ║                         Negativ: Satznummer in Datei Unit 100       ║
  4062.        ║INTEGER          Adresse des Verwaltungsfeldes.                      ║
  4063.        ║INTEGER          Return: Fehlerflag                                  ║
  4064.        ║                         0: Subroutine erfolgreich abgeschlossen.    ║
  4065.        ║                         1: Ein Fehler ist aufgetreten.              ║
  4066.        ╟─────────────────────────────────────────────────────────────────────╢
  4067.        ║Subroutinen:     GETMEM                                              ║
  4068.        ╟─────────────────────────────────────────────────────────────────────╢
  4069.        ║Beispiel:        INTEGER FELD(12),VSEG,H,B,ZEI,SP,OP,SEG             ║
  4070.        ║                 OPEN (1,FILE='TEST',ACCESS='DIRECT',                ║
  4071.        ║                -FORM='FORMATTED',RECL=72,STATUS='OLD')              ║
  4072.        ║                 CALL TEXFEN (2,12,3,20,1,1,23,VSEG,I)               ║
  4073.        ║                 IF (I .NE. 0) GOTO 1                                ║
  4074.        ║                 CALL RAMFEN (2,1,0,'Auswählen: <Esc>','NUM',VSEG,I) ║
  4075.        ║                 IF (I .NE. 0) GOTO 1                                ║
  4076.        ║                 CALL GETFEN (2,5,10,VSEG,I)                         ║
  4077.     
  4078.  
  4079.                                                                       Seite 89
  4080.  
  4081.  
  4082.        ║                 IF (I .NE. 0) GOTO 1                                ║
  4083.        ║                 CALL INFFEN (2,H,B,ZEI,SP,OP,SEG,VSEG,I)            ║
  4084.        ║                 IF (I .NE. 0) GOTO 1                                ║
  4085.        ║                 RETURN                                              ║
  4086.        ║               1 WRITE(*,'(1X,A)') 'FEHLER'                          ║
  4087.        ║                 Aus einer direct orgsanisierten Datei mit dem Unit 1║
  4088.        ║                 werden mit Hilfe der Subroutine "TEXFEN" 12 Menü-   ║
  4089.        ║                 texte dreispaltig mit einer jeweiligen Länge von    ║
  4090.        ║                 20 Characters und dem Farbattribut 23 im Fenster    ║
  4091.        ║                 Nummer 2 abgelegt.                                  ║
  4092.        ║                 Die Subroutine "RAMFEN" umgibt das Menüfeld im      ║
  4093.        ║                 Fenster mit einen einfachen Rahmen und schreibt in  ║
  4094.        ║                 die erste Zeile des Fensters eine Meldung. In die   ║
  4095.        ║                 letzte Zeile des Fensters wird außerdem die Nummer  ║
  4096.        ║                 des Fensters eingeblendet. Rahmen und Texte werden  ║
  4097.        ║                 in der vorhandenen Farbe dargestellt.               ║
  4098.        ║                 Die Subroutine "GETFEN" öffnet das Fenster mit dem  ║
  4099.        ║                 Menütext am Bildschirm ab der 5. Zeile und der 10.  ║
  4100.        ║                 Spalte.                                             ║
  4101.        ║                 "INFFEN" gibt die aktuellen Parameter des Fensters  ║
  4102.        ║                 an das rufende Programm zurück.                     ║
  4103.        ║                 Wenn in einer Subroutine ein Fehler auftritt, wird  ║
  4104.        ║                 eine Fehlermeldung ausgegeben.                      ║
  4105.        ╚═════════════════════════════════════════════════════════════════════╝
  4106.     
  4107.  
  4108.                                                                       Seite 90
  4109.  
  4110.  
  4111.        Schriftengeneratoren
  4112.  
  4113.        Manchmal ist es erwünscht, Hinweise in besonders auffälliger übergroßer
  4114.        Schrift auf den Bildschirm zu schreiben.  FORSUB.LIB stellt zwei
  4115.        Blockschriften für diesen Zweck zur Verfügung.  Beide Schriften sind
  4116.        acht mal sieben Zeichenfelder groß.  Die erste Schrift entspricht in
  4117.        ihrer Form dem gerade aktivierten PC-Zeichensatz.  Die zweite Schrift
  4118.        ist filigraner als die erste, enthält aber nicht alle 256 Zeichen des
  4119.        PC-Zeichensatzes.  Mit diesen Schriften können drei Zeilen mit jeweils
  4120.        zehn Zeichen auf dem Bildschirm positioniert werden.
  4121.  
  4122.        In Systemen mit EGA- oder VGA-Konfiguration ist das Aktivieren von
  4123.        User-Zeichensätzen möglich.  Der in einer Script-Datei abgelegte
  4124.        Zeichensatz wird dazu eingelesen.  Die Zeichen des User-Zeichensatzes
  4125.        stehen bis zum nächsten Wechsel des Videomodus, auch nach dem Beenden
  4126.        des Programms, für alle Bildschirm-Ein- und Ausgaben zur Verfügung.  Die
  4127.        Höhe der Zeichen eines User-Zeichensatzes ist dabei variabel.
  4128.  
  4129.        Zu den Utilities der FORTRAN-Library gehört ein Programm USERZ, mit
  4130.        dessen Hilfe eigene Zeichensätze erstellt oder korrigiert werden können.
  4131.        Vier fertige Zeichensätze sind ebenfalls in den Utilities enthalten.
  4132.  
  4133.  
  4134.        Subroutinen zur Schriftengeneration
  4135.  
  4136.        BLOCK   a) Filigrane Blockschrift in ein Characterfeld schreiben
  4137.        BLOCK1  a) PC-Zeichensatz äquivalente Blockschrift in ein
  4138.                   Characterfeld schreiben
  4139.        SCBL    a) Filigrane Blockschrift auf den Bildschirm schreiben
  4140.                b) Filigrane Bockschrift mittenzentriert auf den Bildschirm
  4141.                   schreiben
  4142.                c) PC-Zeichensatz äquivalente Blockschrift auf den Bildschirm
  4143.                   schreiben
  4144.                d) PC-Zeichensatz äquivalente Bockschrift mittenzentriert auf
  4145.                   den Bildschirm schreiben
  4146.        SCRIPT  a) User-Zeichensatz für die Bildschirmausgabe aus einer
  4147.                   Scriptdatei laden
  4148.     
  4149.  
  4150.                                                                       Seite 91
  4151.  
  4152.  
  4153.        ╔═════════════════════════════════════════════════════════════════════╗
  4154.        ║Beschreibung der Subroutine BLOCK (TEXT,ANZ,FELD)                    ║
  4155.        ║Die Subroutine füllt ein Characterfeld "FELD" mit einen Text aus     ║
  4156.        ║Blocklettern der Größe 8 * 7 Zeichen. Der in Blocklettern zu         ║
  4157.        ║konvertierende Text "TEXT" und die Anzahl der zu konvertierenden     ║
  4158.        ║Zeichen "ANZ" werden übergeben. Die tatsächliche Zeilenlänge des     ║
  4159.        ║Characterfeldes wird an das rufende Programm zurückgegeben.          ║
  4160.        ║Kleingeschriebene Buchstaben werden in Großbuchstaben umgewandelt.   ║
  4161.        ╟─────────────────────────────────────────────────────────────────────╢
  4162.        ║Parameter:                                                           ║
  4163.        ║CHARACTERSTRING  Zu konvertierender Text [max. 10 Zeichen].          ║
  4164.        ║INTEGER          Anzahl der zu konvertierenden Zeichen [1 bis 10]    ║
  4165.        ║                 Return: Zeilenlänge des Characterfeldes.            ║
  4166.        ║CHARACTERFELD    Return: Feld mit Blocklettern                       ║
  4167.        ║                 [FELD(7) * (8*Anzahl Zeichen)]  (z. B. FELD(7)*80). ║
  4168.        ╟─────────────────────────────────────────────────────────────────────╢
  4169.        ║Subroutinen:     UPCASE                                              ║
  4170.        ╟─────────────────────────────────────────────────────────────────────╢
  4171.        ║Beispiel:        CHARACTER FELD(7)*40                                ║
  4172.        ║                 CALL BLOCK ('Block',5,FELD)                         ║
  4173.        ║                 Im Characterfeld "FELD" wird das Wort "BLOCK" in    ║
  4174.        ║                 Blocklettern zurückgegeben.                         ║
  4175.        ╚═════════════════════════════════════════════════════════════════════╝
  4176.     
  4177.  
  4178.                                                                       Seite 92
  4179.  
  4180.  
  4181.        ╔═════════════════════════════════════════════════════════════════════╗
  4182.        ║Beschreibung der Subroutine BLOCK1 (TEXT,ANZ,FELD)                   ║
  4183.        ║Die Subroutine füllt ein Characterfeld "FELD" mit einen Text aus     ║
  4184.        ║Blocklettern der Größe 8 * 7 Zeichen. Der in Blocklettern zu         ║
  4185.        ║konvertierende Text "TEXT" und die Anzahl der zu konvertierenden     ║
  4186.        ║Zeichen "ANZ" werden übergeben. Die tatsächliche Zeilenlänge des     ║
  4187.        ║Characterfeldes wird an das rufende Programm zurückgegeben.          ║
  4188.        ║Es werden die ersten 127 ASCII-Zeichen berücksichtigt.               ║
  4189.        ╟─────────────────────────────────────────────────────────────────────╢
  4190.        ║Parameter:                                                           ║
  4191.        ║CHARACTERSTRING  Zu konvertierender Text [max. 10 Zeichen].          ║
  4192.        ║INTEGER          Anzahl der zu konvertierenden Zeichen [1 bis 10]    ║
  4193.        ║                 Return: Zeilenlänge des Characterfeldes.            ║
  4194.        ║CHARACTERFELD    Return: Feld mit Blocklettern                       ║
  4195.        ║                 [FELD(7) * (8*Anzahl Zeichen)]  (z. B. FELD(7)*80). ║
  4196.        ╟─────────────────────────────────────────────────────────────────────╢
  4197.        ║Subroutinen:     keine                                               ║
  4198.        ╟─────────────────────────────────────────────────────────────────────╢
  4199.        ║Beispiel:        CHARACTER FELD(7)*40                                ║
  4200.        ║                 CALL BLOCK1 ('Block',5,FELD)                        ║
  4201.        ║                 Im Characterfeld "FELD" wird das Wort "Block" in    ║
  4202.        ║                 Blocklettern zurückgegeben.                         ║
  4203.        ╚═════════════════════════════════════════════════════════════════════╝
  4204.     
  4205.  
  4206.                                                                       Seite 93
  4207.  
  4208.  
  4209.        ╔═════════════════════════════════════════════════════════════════════╗
  4210.        ║Beschreibung der Subroutine SCBL (TEXT,ANZ,ZEI,SP,HGZ,COL,ART)       ║
  4211.        ║Die Subroutine schreibt einen Text mit Blocklettern der Größe 8 * 7  ║
  4212.        ║Zeichen positioniert auf den Bildschirm. Es besteht die Möglichkeit, ║
  4213.        ║den Text mittenzentriert darzustellen.                               ║
  4214.        ║Wenn "ART" kleiner 5 ist, wird eine filigrane Schrift verwendet, mit ║
  4215.        ║der sich aber nur Großbuchstaben darstellen lassen. "ART" größer oder║
  4216.        ║kleiner Null benutzt das Bitmuster des RAM-Zeichensatzes. Damit      ║
  4217.        ║können die ersten 127 ASCII-Zeichen dargestellt werden. Die Schrift  ║
  4218.        ║ist relativ grob.                                                    ║
  4219.        ╟─────────────────────────────────────────────────────────────────────╢
  4220.        ║Parameter:                                                           ║
  4221.        ║CHARACTERSTRING  Zu konvertierender Text [max. 10 Zeichen].          ║
  4222.        ║INTEGER          Anzahl der zu konvertierenden Zeichen [1 bis 10]    ║
  4223.        ║INTEGER          Erste Zeile der Darstellung [1 BIS 25].             ║
  4224.        ║INTEGER          Erste Spalte der Darstellung [1 BIS 72].            ║
  4225.        ║                 oder 100 für mittenzentrierte Darstellung.          ║
  4226.        ║INTEGER          Hintergrunddarstellung:                             ║
  4227.        ║                 0: Hintergund mit Blanks beschreiben                ║
  4228.        ║                 1: Hintergrund mit ░ beschreiben                    ║
  4229.        ║                 2: Hintergrund mit ▒ beschreiben                    ║
  4230.        ║                 3: Hintergrund mit ▓ beschreiben                    ║
  4231.        ║                 4: Hintergrund mit █ beschreiben                    ║
  4232.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn   ║
  4233.        ║                 ein Monochrome-Monitor erkannt wird, erfolgt die    ║
  4234.        ║                 Darstellung im Schwarz/Weiß-Modus.                  ║
  4235.        ║                 Bit 0 - 2: Vordergrundfarbe                         ║
  4236.        ║                 Bit 3    : Intensität der Vordergrundfarbe          ║
  4237.        ║                 Bit 4 - 6: Hintergrundfarbe                         ║
  4238.        ║                 Bit 7    : blinken                                  ║
  4239.        ║INTEGER          Art der Darstellung:                                ║
  4240.        ║                 0: filigraner Zeichensatz, normale Darstellung      ║
  4241.        ║                 1: filigraner Zeichensatz, inverse Darstellung      ║
  4242.        ║                 2: filigraner Zeichensatz, intensive Darstellung    ║
  4243.        ║                 3: filigraner Zeichensatz, blinkende Darstellung    ║
  4244.        ║                 4: filigraner Zeichensatz, intensiv/inv. Darstellung║
  4245.        ║                 5: ASCII-Zeichensatz, normale Darstellung           ║
  4246.        ║                 6: ASCII-Zeichensatz, inverse Darstellung           ║
  4247.        ║                 7: ASCII-Zeichensatz, intensive Darstellung         ║
  4248.        ║                 8: ASCII-Zeichensatz, blinkende Darstellung         ║
  4249.        ║                 9: ASCII-Zeichensatz, intensiv/invverse Darstellung ║
  4250.        ╟─────────────────────────────────────────────────────────────────────╢
  4251.        ║Subroutinen:     ATTRIB,BLOCK,BLOCK1,SCREEN                          ║
  4252.        ╟─────────────────────────────────────────────────────────────────────╢
  4253.        ║Beispiel:        CALL SCBL ('Block',5,10,10,0,23,0)                  ║
  4254.        ║                 Der Text "BLOCK" wird in Blocklettern ab der 10.    ║
  4255.        ║                 Zeile und der 10. Spalte in hellgrauer Farbe auf    ║
  4256.        ║                 blauem Hintergrund auf den Bildschirm gebracht.     ║
  4257.        ║                 Die Darstellung erfolgt normal, der Hintergrund wird║
  4258.        ║                 mit Blanks beschrieben.                             ║
  4259.        ╚═════════════════════════════════════════════════════════════════════╝
  4260.     
  4261.  
  4262.                                                                       Seite 94
  4263.  
  4264.  
  4265.        ╔══════════════════════════════════════════════════════════════════════╗
  4266.        ║Beschreibung der Subroutine SCRIPT (FILE,FLAG)                        ║
  4267.        ║Die Subroutine lädt einen Textzeichensatz für die Bildschirmausgabe.  ║
  4268.        ║Der neue Textzeichensatz bleibt bis zum Setzen eines neuen Videomodus ║
  4269.        ║erhalten. Der neue Textzeichensatz wird aus einem Scriptfile          ║
  4270.        ║eingelesen. Die Zeichenhöhe wird aus der Größe des Scriptfiles        ║
  4271.        ║errechnet, die Zeichenbreite ist 8 Pixel. Die Subroutine führt bei    ║
  4272.        ║allen vom Standard (14 Pixel Zeichenhöhe) abweichenden Zeichenhöhen   ║
  4273.        ║eine automatische Cursor-Korrektur durch. Nach dem Setzen eines neuen ║
  4274.        ║Videomodus wird der Cursor in der Zeichenmitte angezeigt, da die      ║
  4275.        ║Korrektur nicht rückgängig gemacht werden kann. Die Subroutine        ║
  4276.        ║funktioniert nur in den Videotextmodi und wenn eine EGA- oder VGA-    ║
  4277.        ║Karte vorhanden ist. Es stehen mehrere Scriptfiles zur Verfügung.     ║
  4278.        ║In "FLAG" wird eine Null zurückgegeben, wenn die Subroutine erfolg-   ║
  4279.        ║reich abschließt, sonst ein Fehlercode. Es kann gewählt werden, ob der║
  4280.        ║bisherige Bildschirminhalt erhalten bleiben soll oder nicht.          ║
  4281.        ╟──────────────────────────────────────────────────────────────────────╢
  4282.        ║Parameter:                                                            ║
  4283.        ║CHARACTERSTRING  Filename des Scriptfiles. Es ist möglich, einen Path ║
  4284.        ║                 mit zu übergeben. Das letzte Zeichen im String muß   ║
  4285.        ║                 ein Nullcharacter sein.                              ║
  4286.        ║INTEGER          Löschflag:                                           ║
  4287.        ║                 0:  Bildschirminhalt erhalten                        ║
  4288.        ║                 1:  Bildschirminhalt löschen                         ║
  4289.        ║                 Return: Fehlerflag:                                  ║
  4290.        ║                 0:  Routine erfolgreich beendet                      ║
  4291.        ║                 1:  Keine hochauflösende Graphikkarte vorhanden      ║
  4292.        ║                 2:  Kein Textmodus eingeschaltet                     ║
  4293.        ║                 3:  Aktiver Monitor nicht an der hochauflösenden     ║
  4294.        ║                     Graphikkarte angeschlossen                       ║
  4295.        ║                 4:  Fehler beim Öffnen der Script-Datei              ║
  4296.        ║                 5:  Fehler beim Lesen der Script-Datei               ║
  4297.        ╟──────────────────────────────────────────────────────────────────────╢
  4298.        ║Beispiel:        I=0                                                  ║
  4299.        ║                 CALL SCRIPT ('C:\SCR24'//CHAR(0),I)                  ║
  4300.        ║                 Der Scriptfile SCR24 wird aus der Root des Laufwerks ║
  4301.        ║                 C: eingelesen. Alle bis zum nächsten Wechsel des     ║
  4302.        ║                 Videomodus auf den Bildschirm ausgegebenen Zeichen   ║
  4303.        ║                 entsprechen dem in SCR24 enthaltenen Textzeichensatz.║
  4304.        ║                 Der Inhalt des Bildschirms wird nicht gelöscht.      ║
  4305.        ║                 In "I" steht eine Null, wenn die Routine mit Erfolg  ║
  4306.        ║                 beendet wurde.                                       ║
  4307.        ╚══════════════════════════════════════════════════════════════════════╝
  4308.     
  4309.  
  4310.                                                                       Seite 95
  4311.  
  4312.  
  4313.        Zeit- und Akustiksteuerung
  4314.  
  4315.        Es ist sinnvoll, Hinweise und Warnungen, die am Bildschirm ausgegeben
  4316.        werden, akustisch hervorzuheben.  In FORSUB.LIB gibt es dazu eine
  4317.        Subroutine, die es gestattet, einen Ton mit vorgegebener Frequenz und
  4318.        Zeitdauer zu erzeugen.  Ein Programm kann mit einer anderen Subroutine
  4319.        für eine bestimmte Zeitspanne unterbrochen werden, um Hinweise,
  4320.        Warnungen oder Programmoutputs eine Weile am Bildschirm zu erhalten.
  4321.  
  4322.  
  4323.        Subroutinen zur Zeit und Akustiksteuerung
  4324.  
  4325.        LAUT    a) Ton variabler Frequenz und Zeitdauer erzeugen (Parameter in
  4326.                   PC-Zeiteinheiten)
  4327.                b) Pause mit variabler Zeitdauer erzeugen (Parameter in
  4328.                   PC-Zeiteinheiten)
  4329.        PIEPS   a) Ton variabler Frequenz und Zeitdauer erzeugen (Parameter in
  4330.                   Real-Sekunden und Integer-Hertz)
  4331.        PAUS    a) Pause variabler Zeitdauer erzeugen (Parameter in Integer-
  4332.                   Sekunden)
  4333.                b) Pause bis zum nächsten Tastendruck erzeugen
  4334.     
  4335.  
  4336.                                                                       Seite 96
  4337.  
  4338.  
  4339.        ╔══════════════════════════════════════════════════════════════════════╗
  4340.        ║Beschreibung der Subroutine LAUT (FREQ,ZEIT,ART)                      ║
  4341.        ║Die Subroutine erzeugt je nach dem in ART übergebenen Flag einen Ton  ║
  4342.        ║vorgegebener Frequenz und Zeitdauer oder eine Pause im Programmablauf ║
  4343.        ║mit vorgegebener Zeitdauer.                                           ║
  4344.        ╟──────────────────────────────────────────────────────────────────────╢
  4345.        ║Parameter:                                                            ║
  4346.        ║INTEGER          Faktor für die Tonfrequenz [ 1193180/Hertz ].        ║
  4347.        ║INTEGER          Faktor für die Zeitdauer [ Sekunden/0.055 ].         ║
  4348.        ║INTEGER          Flag für die Arbeitsart:                             ║
  4349.        ║                 0: Ton erzeugen                                      ║
  4350.        ║                 1: Pause erzeugen                                    ║
  4351.        ╟──────────────────────────────────────────────────────────────────────╢
  4352.        ║Beispiele:       CALL LAUT (1491,55,0)                                ║
  4353.        ║                 Es wird ein drei Sekunden langer Ton mit einer       ║
  4354.        ║                 Frequenz von 800 Hertz erzeugt.                      ║
  4355.        ║                 CALL LAUT (0,4,1)                                    ║
  4356.        ║                 Der Programmablauf wird für 0.22 Sekunden            ║
  4357.        ║                 unterbrochen.                                        ║
  4358.        ╚══════════════════════════════════════════════════════════════════════╝
  4359.     
  4360.  
  4361.                                                                       Seite 97
  4362.  
  4363.  
  4364.        ╔═════════════════════════════════════════════════════════════════════╗
  4365.        ║Beschreibung der Subroutine PIEPS (FREQ,DAUER)                       ║
  4366.        ║Die Subroutine erzeugt einen Ton mit der Frequenz FREQ und der       ║
  4367.        ║Zeitdauer DAUER.                                                     ║
  4368.        ╟─────────────────────────────────────────────────────────────────────╢
  4369.        ║Parameter:                                                           ║
  4370.        ║INTEGER          Frequenz des Tones in Hertz                         ║
  4371.        ║REAL             Zeitdauer des Tones in Sekunden.                    ║
  4372.        ╟─────────────────────────────────────────────────────────────────────╢
  4373.        ║Subroutinen:     LAUT                                                ║
  4374.        ╟─────────────────────────────────────────────────────────────────────╢
  4375.        ║Beispiel:        CALL PIEPS (1250,0.3)                               ║
  4376.        ║                 Es wird ein 0.3 Sekunden dauernder Ton mit einer    ║
  4377.        ║                 Frequenz von 1250 Hertz erzeugt.                    ║
  4378.        ╚═════════════════════════════════════════════════════════════════════╝
  4379.     
  4380.  
  4381.                                                                       Seite 98
  4382.  
  4383.  
  4384.        ╔═════════════════════════════════════════════════════════════════════╗
  4385.        ║Beschreibung der Subroutine PAUS (N)                                 ║
  4386.        ║Wenn N positiv ist, erzeugt die Subroutine eine N Sekunden lange     ║
  4387.        ║Pause. Wenn N negativ ist, wird das Programm bis zum Betätigen einer ║
  4388.        ║beliebigen Taste unterbrochen.                                       ║
  4389.        ╟─────────────────────────────────────────────────────────────────────╢
  4390.        ║Parameter:                                                           ║
  4391.        ║INTEGER          Dauer der Pause in Sekunden bzw. Indikator für den  ║
  4392.        ║                 Wartestatus bis zum Betätigen einer Taste.          ║
  4393.        ╟─────────────────────────────────────────────────────────────────────╢
  4394.        ║Subroutinen:     LAUT,TAST                                           ║
  4395.        ╟─────────────────────────────────────────────────────────────────────╢
  4396.        ║Beispiele:       CALL PAUS (10)                                      ║
  4397.        ║                 Es wird eine Pause von 10 Sekunden generiert.       ║
  4398.        ║                 CALL PAUS (-1)                                      ║
  4399.        ║                 Der Programmablauf wird bis zum Betätigen einer     ║
  4400.        ║                 beliebigen Taste unterbrochen.                      ║
  4401.        ╚═════════════════════════════════════════════════════════════════════╝
  4402.     
  4403.  
  4404.                                                                       Seite 99
  4405.  
  4406.  
  4407.        Transformationen
  4408.  
  4409.        Häufig benötigte Umwandlungen von einem Format in ein anderes sind mit
  4410.        Subroutinen in FORSUB.LIB automatisiert.  Dazu gehören das Erzeugen
  4411.        alternativer Farbattribute mit automatischer Anpassung an die
  4412.        Videokonfiguration, Umwandlungen von Maschinenadressen, Datums- und
  4413.        Zeitformaten.  Das Umwandeln von Strings in Integers und von Integers
  4414.        in Strings ist zwar mit der "WRITE"-Routine aus der Standardbibliothek
  4415.        möglich, jedoch sind die FORSUB-Routinen sehr viel schneller.
  4416.  
  4417.  
  4418.        Subroutinen für Transformationen
  4419.  
  4420.        ATTCOL  a) Farbattribute der Videokonfiguration anpassen
  4421.        ATTRIB  a) Alternative Farbattribute erzeugen und der Videokonfiguration
  4422.                   anpassen
  4423.        ADRESS  a) Maschinenadresse in Segment und Offset aufteilen
  4424.        DTRAN   a) Characterformat eines Datums in das Integerformat umwandeln
  4425.                b) Integerformat eines Datums in das Characterformat umwandeln
  4426.        ZTRAN   a) Characterformat einer Zeitangabe in das Integerformat
  4427.                   umwandeln
  4428.                b) Integerformat einer Zeitangabe in das Characterformat
  4429.                   umwandeln
  4430.        AITRAN  a) Characterstring in mehrere Integers umwandeln
  4431.        IATRAN  a) Integer in Characterstring umwandeln
  4432.     
  4433.  
  4434.                                                                      Seite 100
  4435.  
  4436.  
  4437.        ╔══════════════════════════════════════════════════════════════════════╗
  4438.        ║Beschreibung der Subroutine ATTCOL (COL)                              ║
  4439.        ║Die Subroutine stellt fest, ob eine Farb- oder Monochromekonfiguration║
  4440.        ║vorhanden ist und stellt das Farbattribut gegebenenfalls auf die für  ║
  4441.        ║Monochromekonfigurationen geeignete Form ein. Das Intensitäts- und das║
  4442.        ║Blinkbit bleiben dabei unverändert.                                   ║
  4443.        ╟──────────────────────────────────────────────────────────────────────╢
  4444.        ║Parameter:                                                            ║
  4445.        ║INTEGER          Farbattribut; Siehe Anhang: "Farbattribute". Wenn ein║
  4446.        ║                 Monochrome-Monitor erkannt wird, erfolgt eine        ║
  4447.        ║                 Umwandlung in ein dafür geeignetes Attribut.         ║
  4448.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  4449.        ║                 Bit 3    : Intensität der Vordergundfarbe            ║
  4450.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  4451.        ║                 Bit 7    : blinken                                   ║
  4452.        ╟──────────────────────────────────────────────────────────────────────╢
  4453.        ║Beispiele:       INTEGER COL/23/                                      ║
  4454.        ║                 CALL ATTCOL (COL)                                    ║
  4455.        ║                 Das Farbattribut 23 (grau auf blau) wird bei der     ║
  4456.        ║                 Verwendung eines Monochrome-Monitors in das Farb-    ║
  4457.        ║                 attribut 7 (hellgrau auf schwarz) umgewandelt. Bei   ║
  4458.        ║                 Farbmonitoren bleibt das ursprüngliche Attribut 23   ║
  4459.        ║                 erhalten.                                            ║
  4460.        ╚══════════════════════════════════════════════════════════════════════╝
  4461.     
  4462.  
  4463.                                                                      Seite 101
  4464.  
  4465.  
  4466.        ╔══════════════════════════════════════════════════════════════════════╗
  4467.        ║Beschreibung der Subroutine ATTRIB (COL,INV,BOLD,BLINK,BOIN)          ║
  4468.        ║Die Subroutine konvertiert das in COL übergebene Farbattribut in je   ║
  4469.        ║ein inverses, reziprok-intensives, blinkendes und reziprok-           ║
  4470.        ║intensiv/inverses Attribut. Wenn die Subroutine feststellt, daß ein   ║
  4471.        ║Monochromebildschirm angeschlossen ist, wird das Farbattribut COL     ║
  4472.        ║hellgrau auf schwarz gesetzt. Die restlichen Attribute werden         ║
  4473.        ║entsprechend gesetzt.                                                 ║
  4474.        ╟──────────────────────────────────────────────────────────────────────╢
  4475.        ║Parameter:                                                            ║
  4476.        ║INTEGER          Farbattribut normal.                                 ║
  4477.        ║                 Bit 0 - 2: Vordergrundfarbe                          ║
  4478.        ║                 Bit 3    : Intensität der Vordergrundfarbe           ║
  4479.        ║                 Bit 4 - 6: Hintergrundfarbe                          ║
  4480.        ║                 Bit 7    : blinken                                   ║
  4481.        ║                 Return: Farbattribut hellgrau auf schwarz wenn ein   ║
  4482.        ║                 Monochromemonitor festgestellt wurde.                ║
  4483.        ║INTEGER          Return: Farbattribut inverse.                        ║
  4484.        ║INTEGER          Return: Farbattribut reziprok-intensive.             ║
  4485.        ║INTEGER          Return: Farbattribut blinkend.                       ║
  4486.        ║INTEGER          Return: Farbattribut reziprok-intensiv/inverse.      ║
  4487.        ╟──────────────────────────────────────────────────────────────────────╢
  4488.        ║Subroutinen:     ATTCOL                                               ║
  4489.        ╟──────────────────────────────────────────────────────────────────────╢
  4490.        ║Beispiel:        CALL ATTRIB (23,I,J,K,L)                             ║
  4491.        ║                 Aus dem Farbattribut 23 (hellgrau auf blau) werden in║
  4492.        ║                 den Variablen das inverse, das reziprok-intensive,   ║
  4493.        ║                 das blinkende und das reziprok-intensiv/inverse      ║
  4494.        ║                 Farbattribut erzeugt und an das rufende Programm     ║
  4495.        ║                 übergeben.                                           ║
  4496.        ╚══════════════════════════════════════════════════════════════════════╝
  4497.     
  4498.  
  4499.                                                                      Seite 102
  4500.  
  4501.  
  4502.        ╔═════════════════════════════════════════════════════════════════════╗
  4503.        ║Beschreibung der Subroutine ADRESS (ADDR,SEG,OFF)                    ║
  4504.        ║Die Subroutine ermittelt aus einer Maschinenadresse im Integer-4-    ║
  4505.        ║Format das Segment und das Offset und übergibt diese in zwei         ║
  4506.        ║Integer-4-Variablen.                                                 ║
  4507.        ╟─────────────────────────────────────────────────────────────────────╢
  4508.        ║Parameter:                                                           ║
  4509.        ║INTEGER          Maschinenadresse im Integer-4-Format (z.B. aus der  ║
  4510.        ║                 Function LOC(Variable) ).                           ║
  4511.        ║INTEGER          Return: Segment der Adresse.                        ║
  4512.        ║INTEGER          Return: Offset der Adresse.                         ║
  4513.        ╟─────────────────────────────────────────────────────────────────────╢
  4514.        ║Subroutinen:     keine                                               ║
  4515.        ╟─────────────────────────────────────────────────────────────────────╢
  4516.        ║Beispiel:        INTEGER ADDR,SEG,OFF                                ║
  4517.        ║                 REAL VARIAB                                         ║
  4518.        ║                 CALL ADRESS (LOC(VARIAB),SEG,OFF)                   ║
  4519.        ║                 In SEG und OFF werden Segment und Offset der        ║
  4520.        ║                 Maschinenadresse zurückgegeben, an der der Inhalt   ║
  4521.        ║                 der Real-Variablen VARIAB gespeichert ist.          ║
  4522.        ╚═════════════════════════════════════════════════════════════════════╝
  4523.     
  4524.  
  4525.                                                                      Seite 103
  4526.  
  4527.  
  4528.        ╔═════════════════════════════════════════════════════════════════════╗
  4529.        ║Beschreibung der Subroutine DTRAN (IDAT,CDAT,ART)                    ║
  4530.        ║Die Subroutine wandelt ein Datum im Stringformat der Form            ║
  4531.        ║"TT.MM.JJJJ" in ein Integerformat der Form "JJJJMMTT" um, wenn in    ║
  4532.        ║"ART" eine 1 übergeben wird. Wenn "ART" 0 ist, erfolgt die Wandlung  ║
  4533.        ║vom Integerformat ins Characterformat. Wenn bei der Wandlung ein     ║
  4534.        ║Fehler auftritt, wird "0" bzw. "##########" zurückgegeben.           ║
  4535.        ╟─────────────────────────────────────────────────────────────────────╢
  4536.        ║Parameter:                                                           ║
  4537.        ║INTEGER          Datum in der Form JJJJMMTT.                         ║
  4538.        ║                 Return (ART=1): Datum in der Form JJJJMMTT.         ║
  4539.        ║CHARACTERSTRING  Datum in der Form TT.MM.JJJJ. [10 Characters]       ║
  4540.        ║                 Return (ART=0): Datum in der Form TT.MM.JJJJ.       ║
  4541.        ║INTEGER          Indikator für die Art der Umwandlung [0 oder 1].    ║
  4542.        ╟─────────────────────────────────────────────────────────────────────╢
  4543.        ║Beispiel:        CHARACTER DAT*10                                    ║
  4544.        ║                 CALL DTRAN (19890817,DAT,0)                         ║
  4545.        ║                 Im String "DAT" steht nun "17.08.1989".             ║
  4546.        ╚═════════════════════════════════════════════════════════════════════╝
  4547.     
  4548.  
  4549.                                                                      Seite 104
  4550.  
  4551.  
  4552.        ╔═════════════════════════════════════════════════════════════════════╗
  4553.        ║Beschreibung der Subroutine ZTRAN (IZEIT,CZEIT,ART)                  ║
  4554.        ║Die Subroutine wandelt die Zeit im Stringformat der Form             ║
  4555.        ║"HH.MM.SS" in ein Integerformat der Form "HHMMSS" um, wenn in "ART"  ║
  4556.        ║eine 1 übergeben wird. Wenn "ART" 0 ist, erfolgt die Wandlung vom    ║
  4557.        ║Integerformat ins Characterformat. Wenn bei der Wandlung ein         ║
  4558.        ║Fehler auftritt, wird "0" bzw. "########" zurückgegeben.             ║
  4559.        ╟─────────────────────────────────────────────────────────────────────╢
  4560.        ║Parameter:                                                           ║
  4561.        ║INTEGER          Zeit in der Form HHMMSS.                            ║
  4562.        ║                 Return (ART=1): Zeit in der Form HHMMSS.            ║
  4563.        ║CHARACTERSTRING  Zeit in der Form HH.MM.SS. [10 Characters]          ║
  4564.        ║                 Return (ART=0): Zeit in der Form HH.MM.SS.          ║
  4565.        ║INTEGER          Indikator für die Art der Umwandlung [0 oder 1].    ║
  4566.        ╟─────────────────────────────────────────────────────────────────────╢
  4567.        ║Beispiel:        CHARACTER ZT*10                                     ║
  4568.        ║                 CALL ZTRAN (162200,ZT,0)                            ║
  4569.        ║                 Im String "ZT" steht nun "16.22.00".                ║
  4570.        ╚═════════════════════════════════════════════════════════════════════╝
  4571.     
  4572.  
  4573.                                                                      Seite 105
  4574.  
  4575.  
  4576.        ╔══════════════════════════════════════════════════════════════════════╗
  4577.        ║Beschreibung der Subroutine AITRAN (STRING,IFELD,PFELD,FLAG)          ║
  4578.        ║Die Subroutine transformiert einen Characterstring aus Ziffern in     ║
  4579.        ║Integers. Die Integers, deren Längen in "PFELD" eingetragen sind,     ║
  4580.        ║werden in "IFELD" an das rufende Programm zurückgegeben. Wenn         ║
  4581.        ║ungültige Zeichen im String gefunden werden  oder eine Längenangabe   ║
  4582.        ║ungültig ist, wird die Subroutine mit "FLAG" gleich Eins abgebrochen. ║
  4583.        ║Wenn die Subroutine mit Erfolg abgeschlossen wird, steht in "FLAG"    ║
  4584.        ║eine Null. Blanks im String werden als Nullen interpretiert, Minus-   ║
  4585.        ║und Pluszeichen sind zugelassen. Das letzte Zeichen im String muß     ║
  4586.        ║ein Nullcharacter sein. Das Lesen von Integers aus einem String ist   ║
  4587.        ║auch mit der READ-Anweisung möglich, AITRAN sollte aber eingesetzt    ║
  4588.        ║werden, wenn es auf hohe Verarbeitungsgeschwindigkeit ankommt.        ║
  4589.        ╟──────────────────────────────────────────────────────────────────────╢
  4590.        ║Parameter:                                                            ║
  4591.        ║CHARACTERSTRING  [ZIFFERN, PLUS UND MINUSZEICHEN, BLANKS]//CHAR(0)    ║
  4592.        ║INTEGERFELD      Feld mit Längenangaben der aus dem String zu lesenden║
  4593.        ║                 Integers (1 BIS 10)                                  ║
  4594.        ║INTEGERFELD      Return: Feld mit aus dem String gelesenen Integers.  ║
  4595.        ║INTEGER          Return: Fehlerflag:                                  ║
  4596.        ║                 0:  Routine mit Erfolg beendet                       ║
  4597.        ║                 1:  Ein Fehler ist aufgetreten!                      ║
  4598.        ╟──────────────────────────────────────────────────────────────────────╢
  4599.        ║Beispiel:        CHARACTER STRING*16                                  ║
  4600.        ║                 INTEGER ZAHL(6),LANG(6)                              ║
  4601.        ║                 DATA LANG /2,2,2,2,1,6/                              ║
  4602.        ║                 STRING='1234567890-23456'//CHAR(0)                   ║
  4603.        ║                 CALL AITRAN (STRING,LANG,ZAHL,I)                     ║
  4604.        ║                 IF (I .NE. 0) THEN                                   ║
  4605.        ║                    WRITE (*'(1X,A)') 'Fehler!'                       ║
  4606.        ║                 ELSE                                                 ║
  4607.        ║                    WRITE (*'(4(I3),I2,I7)') ZAHL                     ║
  4608.        ║                 ENDIF                                                ║
  4609.        ║                 Die Subroutine liest aus dem String "STRING" sechs   ║
  4610.        ║                 Integers mit den in "LANG" übergebenen Längen aus.   ║
  4611.        ║                 Wenn ein Fehler auftritt, wird eine Meldung          ║
  4612.        ║                 ausgegeben, sonst werden die gelesenen Zahlen auf den║
  4613.        ║                 Bildschirm geschrieben.                              ║
  4614.        ╚══════════════════════════════════════════════════════════════════════╝
  4615.     
  4616.  
  4617.                                                                      Seite 106
  4618.  
  4619.  
  4620.        ╔══════════════════════════════════════════════════════════════════════╗
  4621.        ║Beschreibung der Subroutine IATRAN (IWERT,AWERT,ALANG,FLAG)           ║
  4622.        ║Die Subroutine transformiert eine Integerzahl IWERT in einen          ║
  4623.        ║Characterstring AWERT. Die Länge des übergebenen Characterstrings     ║
  4624.        ║wird in ALANG übergeben. Die Integerzahl wird im String rechtsbündig  ║
  4625.        ║abgelegt; nicht benötigte Stellen werden linksbündig mit Blanks       ║
  4626.        ║überschrieben. Wenn ein Fehler auftritt, weil z. B. der übergebene    ║
  4627.        ║String zu klein ist, wird die Routine mit FLAG gleich 1 abgeschlossen,║
  4628.        ║sonst steht darin eine Null. Das Umformen von Integers in Strings ist ║
  4629.        ║auch mit der WRITE-Anweisung möglich, IATRAN sollte aber eingesetzt   ║
  4630.        ║werden, wenn es auf hohe Verarbeitungsgeschwindigkeit ankommt.        ║
  4631.        ╟──────────────────────────────────────────────────────────────────────╢
  4632.        ║Parameter:                                                            ║
  4633.        ║INTEGER          In ASCII-Zeichen umzuformender Integer-Wert.         ║
  4634.        ║CHARACTER        Return: String mit in ASCII-Zeichen umgeformten      ║
  4635.        ║                 Integerwert [max 128 Byte lang!]                     ║
  4636.        ║INTEGER          Länge des übergebenen Strings AWERT in Byte [MAX 128]║
  4637.        ║INTEGER          Return: Fehlerflag:                                  ║
  4638.        ║                 0:  Routine mit Erfolg beendet                       ║
  4639.        ║                 1:  Ein Fehler ist aufgetreten!                      ║
  4640.        ╟──────────────────────────────────────────────────────────────────────╢
  4641.        ║Beispiel:        CHARACTER STRING*16                                  ║
  4642.        ║                 CALL IATRAN (-123456,STRING,16,I)                    ║
  4643.        ║                 IF (I .NE. 0) THEN                                   ║
  4644.        ║                    WRITE (*'(1X,A)') 'Fehler!'                       ║
  4645.        ║                 ELSE                                                 ║
  4646.        ║                    WRITE (*,'(1X,A16)') STRING                       ║
  4647.        ║                 ENDIF                                                ║
  4648.        ║                 Die Subroutine schreibt die Zahl -123456 rechts-     ║
  4649.        ║                 bündig in der Form "         -123456" in den String. ║
  4650.        ║                 Wenn ein Fehler auftritt, wird eine Meldung          ║
  4651.        ║                 ausgegeben, sonst wird der String am Bildschirm      ║
  4652.        ║                 ausgegeben.                                          ║
  4653.        ╚══════════════════════════════════════════════════════════════════════╝
  4654.     
  4655.  
  4656.                                                                      Seite 107
  4657.  
  4658.  
  4659.        Zufallzahlen und Sortierungen
  4660.  
  4661.        Zufallzahlen sind nie wirklich zufällig;  sie unterliegen gewöhnlich
  4662.        einer mathematischen Gesetzmäßigkeit.  Schließlich werden sie ja durch
  4663.        einen mathematischen Algorithmus erzeugt.  FORSUB.LIB enthält eine
  4664.        Subroutine zur Erzeugung von Zufallzahlen, bei der der mathematische
  4665.        Algorithmus so weit gefächert ist, daß die damit erzeugten Zahlen so gut
  4666.        wie zufällig sind.  Dadurch benötigt die Subroutine allerdings auch
  4667.        relativ viel Zeit für ihre Ausführung.
  4668.  
  4669.        In FORSUB.LIB sind Subroutinen zur Sortierung von Feldern der
  4670.        verschiedenen Datentypen enthalten.  Je nach Bedarf kann steigend oder
  4671.        fallend sortiert werden.
  4672.  
  4673.  
  4674.        Subroutinen für Sortierungen und zur Erzeugung von Zufallzahlen
  4675.  
  4676.        ZUFALL  a) Zufallzahl innerhalb vorgegebener Schranken erzeugen
  4677.        ZUFAFE  a) Feld mit mehrdeutigen Zufallzahlen innerhalb vorgegebener
  4678.                   Schranken erzeugen
  4679.                b) Feld mit eindeutigen Zufallzahlen innerhalb vorgegebener
  4680.                   Schranken erzeugen
  4681.        ISORT   a) Integerwerte steigend sortieren
  4682.                b) Integerwerte fallend sortieren
  4683.        RSORT   a) Realwerte steigend sortieren
  4684.                b) Realwerte fallend sortieren
  4685.        ASORT   a) Characterstrings alphanumerisch steigend sortieren
  4686.                b) Characterstrings alphanumerisch fallend sortieren
  4687.     
  4688.  
  4689.                                                                      Seite 108
  4690.  
  4691.  
  4692.        ╔═════════════════════════════════════════════════════════════════════╗
  4693.        ║Beschreibung der Subroutine ZUFALL (WERT,USCH,OSCH)                  ║
  4694.        ║Die Subroutine erzeugt eine Zufallzahl, die inerhalb der oberen      ║
  4695.        ║Schranke OSCH und der unteren Schranke USCH liegt. Die zu erzeugende ║
  4696.        ║Zufallzahl kann zwischen 0 und 999999 plus dem Wert der unteren      ║
  4697.        ║Schranke liegen.                                                     ║
  4698.        ╟─────────────────────────────────────────────────────────────────────╢
  4699.        ║Parameter:                                                           ║
  4700.        ║INTEGER          Return: Zufallzahl.                                 ║
  4701.        ║INTEGER          untere Schranke (kleinstmögliche Zufallzahl)        ║
  4702.        ║                 [ 0 bis 999999 ].                                   ║
  4703.        ║INTEGER          obere Schranke (größtmögliche Zufallzahl)           ║
  4704.        ║                 [ 1 bis 999999+USCH ].                              ║
  4705.        ╟─────────────────────────────────────────────────────────────────────╢
  4706.        ║Subroutinen:     PIKE,GETTIM                                         ║
  4707.        ╟─────────────────────────────────────────────────────────────────────╢
  4708.        ║Beispiel:        CALL ZUFALL (I,1,49)                                ║
  4709.        ║                 Die Routine erzeugt eine Zufallzahl zwischen 1 und  ║
  4710.        ║                 49 und speichert sie in der Variablen I.            ║
  4711.        ╚═════════════════════════════════════════════════════════════════════╝
  4712.     
  4713.  
  4714.                                                                      Seite 109
  4715.  
  4716.  
  4717.        ╔═════════════════════════════════════════════════════════════════════╗
  4718.        ║Beschreibung der Subroutine ZUFAFE (FELD,ANZ,USCH,OSCH,ART)          ║
  4719.        ║Die Subroutine füllt ein Integerfeld FELD mit ANZ Zufallzahlen, die  ║
  4720.        ║zwischen der oberen Schranke OSCH und der unteren Schranke USCH      ║
  4721.        ║liegen. Die Zufallzahlen können zwischen 0 und 999999 plus dem Wert  ║
  4722.        ║der unteren Schranke liegen. Mit ART wird angegeben, ob Zufallzahlen ║
  4723.        ║ein- oder mehrfach im Integerfeld vorkommen dürfen.                  ║
  4724.        ╟─────────────────────────────────────────────────────────────────────╢
  4725.        ║Parameter:                                                           ║
  4726.        ║INTEGERFELD      Return: Zufallzahlen  [ FELD(ANZ) ].                ║
  4727.        ║INTEGER          Anzahl der zu ermittelnden Zufallzahlen.            ║
  4728.        ║INTEGER          untere Schranke (kleinstmögliche Zufallzahl)        ║
  4729.        ║                 [ 0 bis 999999 ].                                   ║
  4730.        ║INTEGER          obere Schranke (größtmögliche Zufallzahl)           ║
  4731.        ║                 [ 1 bis 999999+USCH ].                              ║
  4732.        ║INTEGER          Belegungsart:  0: Zufallzahlen dürfen mehrfach      ║
  4733.        ║                                   vorkommen.                        ║
  4734.        ║                                1: Zufallzahlen dürfen jeweils nur   ║
  4735.        ║                                   einmal vorkommen                  ║
  4736.        ║                 Return:       -1: Wenn ein Fehler aufgetreten ist   ║
  4737.        ╟─────────────────────────────────────────────────────────────────────╢
  4738.        ║Subroutinen:     PEEK,GETTIM                                         ║
  4739.        ╟─────────────────────────────────────────────────────────────────────╢
  4740.        ║Beispiel:        INTEGER FLED(6)                                     ║
  4741.        ║                 CALL ZUFAFE (FELD,6,1,49,1)                         ║
  4742.        ║                 Die Routine erzeugt sechs Zufallzahlen zwischen 1   ║
  4743.        ║                 und 49 und speichert sie im Integerfeld FELD. Jede  ║
  4744.        ║                 Zufallzahl kommt dabei nur einmal vor.              ║
  4745.        ╚═════════════════════════════════════════════════════════════════════╝
  4746.     
  4747.  
  4748.                                                                      Seite 110
  4749.  
  4750.  
  4751.        ╔═════════════════════════════════════════════════════════════════════╗
  4752.        ║Beschreibung der Subroutine ASORT (ANZ,FELD,ART)                     ║
  4753.        ║Die Subroutine sortiert "ANZ" Characterstrings in einem Feld "FELD". ║
  4754.        ║Wenn in "ART" eine Null übergeben wird, erfolgt die Sortierung       ║
  4755.        ║alphanumerisch steigend, wenn eine Eins übergeben wird, erfolgt die  ║
  4756.        ║Sortierung alphanumerisch fallend. Die alphanumerische Reihenfolge   ║
  4757.        ║entspricht der ASCII-Codetabelle.                                    ║
  4758.        ╟─────────────────────────────────────────────────────────────────────╢
  4759.        ║Parameter:                                                           ║
  4760.        ║INTEGER          Anzahl der zu sortierenden Strings                  ║
  4761.        ║CHARACTERFELD    Feld mit zu sortierenden Strings in der Form        ║
  4762.        ║                 [ FELD(ANZ)*(*) ].                                  ║
  4763.        ║INTEGER          Art der Sortierung:  0: steigende Sortierung        ║
  4764.        ║                                      1: fallende Sortierung         ║
  4765.        ╟─────────────────────────────────────────────────────────────────────╢
  4766.        ║Subroutinen:     keine                                               ║
  4767.        ╟─────────────────────────────────────────────────────────────────────╢
  4768.        ║Beispiel:        CHARACTER FELD(100)*1                               ║
  4769.        ║                 DO 1 I=1,100                                        ║
  4770.        ║                    CALL ZUFALL (CHAR(FELD(I)),0,256)                ║
  4771.        ║               1 CONTINUE                                            ║
  4772.        ║                 CALL ASORT (100,FELD,0)                             ║
  4773.        ║                 Es werden einhundert zufällig erzeugte Zeichen      ║
  4774.        ║                 im Feld "FELD" aufsteigend sortiert.                ║
  4775.        ╚═════════════════════════════════════════════════════════════════════╝
  4776.     
  4777.  
  4778.                                                                      Seite 111
  4779.  
  4780.  
  4781.        ╔═════════════════════════════════════════════════════════════════════╗
  4782.        ║Beschreibung der Subroutine ISORT (ANZ,FELD,ART)                     ║
  4783.        ║Die Subroutine sortiert "ANZ" Integerwerte in einem Wertefeld "FELD".║
  4784.        ║Wenn in "ART" eine Null übergeben wird, erfolgt die Sortierung       ║
  4785.        ║steigend, wenn eine Eins übergeben wird, erfolgt die Sortierung      ║
  4786.        ║fallend.                                                             ║
  4787.        ╟─────────────────────────────────────────────────────────────────────╢
  4788.        ║Parameter:                                                           ║
  4789.        ║INTEGER          Anzahl der zu sortierenden Werte.                   ║
  4790.        ║INTEGERFELD      Feld mit zu sortierenden Integers in der Form       ║
  4791.        ║                 [ FELD(ANZ) ].                                      ║
  4792.        ║INTEGER          Art der Sortierung:  0: steigende Sortierung        ║
  4793.        ║                                      1: fallende Sortierung         ║
  4794.        ╟─────────────────────────────────────────────────────────────────────╢
  4795.        ║Subroutinen:     keine                                               ║
  4796.        ╟─────────────────────────────────────────────────────────────────────╢
  4797.        ║Beispiel:        INTEGER FELD(100)                                   ║
  4798.        ║                 DO 1 I=1,100                                        ║
  4799.        ║                    CALL ZUFALL (FELD(I),0,1000000)                  ║
  4800.        ║               1 CONTINUE                                            ║
  4801.        ║                 CALL ISORT (100,FELD,0)                             ║
  4802.        ║                 Es werden einhundert zufällig erzeugte Integers     ║
  4803.        ║                 im Feld "FELD" aufsteigend sortiert.                ║
  4804.        ╚═════════════════════════════════════════════════════════════════════╝
  4805.     
  4806.  
  4807.                                                                      Seite 112
  4808.  
  4809.  
  4810.        ╔═════════════════════════════════════════════════════════════════════╗
  4811.        ║Beschreibung der Subroutine RSORT (ANZ,FELD,ART)                     ║
  4812.        ║Die Subroutine sortiert "ANZ" Realwerte in einem Wertefeld "FELD".   ║
  4813.        ║Wenn in "ART" eine Null übergeben wird, erfolgt die Sortierung       ║
  4814.        ║steigend, wenn eine Eins übergeben wird, erfolgt die Sortierung      ║
  4815.        ║fallend.                                                             ║
  4816.        ╟─────────────────────────────────────────────────────────────────────╢
  4817.        ║Parameter:                                                           ║
  4818.        ║INTEGER          Anzahl der zu sortierenden Werte.                   ║
  4819.        ║REALFELD         Feld mit zu sortierenden Reals in der Form          ║
  4820.        ║                 [ FELD(ANZ) ].                                      ║
  4821.        ║INTEGER          Art der Sortierung:  0: steigende Sortierung        ║
  4822.        ║                                      1: fallende Sortierung         ║
  4823.        ╟─────────────────────────────────────────────────────────────────────╢
  4824.        ║Subroutinen:     keine                                               ║
  4825.        ╟─────────────────────────────────────────────────────────────────────╢
  4826.        ║Beispiel:        REAL FELD(100)                                      ║
  4827.        ║                 DO 1 I=1,100                                        ║
  4828.        ║                    CALL ZUFALL (J,0,10000000)                       ║
  4829.        ║                    FELD(I)=J/100.0                                  ║
  4830.        ║               1 CONTINUE                                            ║
  4831.        ║                 CALL RSORT (100,FELD,0)                             ║
  4832.        ║                 Es werden einhundert zufällig erzeugte Realwerte    ║
  4833.        ║                 im Feld "FELD" aufsteigend sortiert.                ║
  4834.        ╚═════════════════════════════════════════════════════════════════════╝
  4835.     
  4836.  
  4837.                                                                      Seite 113
  4838.  
  4839.  
  4840.        Stringmanipulationen
  4841.  
  4842.        Unter Stringmanipulationen versteht man Veränderungen in Textstrings,
  4843.        die alle darin enthaltenen Zeichen oder bestimmte Zeichenketten
  4844.        betreffen.  FORSUB.LIB bietet die gebräuchlichsten Subroutinen zur
  4845.        Stringmanipulation, die dem Programmierer viel Arbeit abnehmen.  Jede
  4846.        Subroutine kann Strings bis zu zweihundert Zeichen Länge verarbeiten.
  4847.        Die Verwendung von Substrings ist dabei möglich.  Für den Eingabestring
  4848.        und den Ausgabestring, der das Ergebnis der Stringmanipulation enthält,
  4849.        darf die selbe Variable verwendet werden, wodurch aufwendige
  4850.        Umspeicherungen vermieden werden.
  4851.  
  4852.  
  4853.        Subroutinen für Stringmanipulationen
  4854.  
  4855.        ANZAHL  a) Anzahl der Worte in einer Zeichenkette feststellen
  4856.        CHANGE  a) Zeichenketten gegen andere Zeichenketten in einem Textstring
  4857.                   austauschen
  4858.        CHAWAL  a) Verschiedene Zeichen gegen andere Zeichen in einem Textstring
  4859.                   austauschen
  4860.                b) Verschiedene Zeichen aus dem Textstring entfernen
  4861.        CHAZEI  a) Gruppen von Zeichen gegen ein anderes Zeichen in einem
  4862.                   Textstring austauschen
  4863.        DEHN    a) Textstring durch Vervielfachen der darin enthaltenen
  4864.                   Leerstellen auf eine vorgegebene Länge dehnen
  4865.        DELETE  a) Zeichenketten aus einem Textstring entfernen
  4866.        FUEG    a) Zeichenketten positioniert in einem String einfügen
  4867.        GETWOR  a) Wort mit vorgegebener Nummer aus einem String lesen
  4868.        LAENGE  a) Position des letzten Zeichens in einem Textstring ermitteln
  4869.        NEXT    a) Position des nächsten Wortes ab einer vorgegebenen Position
  4870.                   im Textstring ermitteln
  4871.        POSIT   a) Position des erstmaligen Auftretens einer Zeichenkette in
  4872.                   einem Textstring ermitteln
  4873.                b) Position des letztmaligen Auftretens einer Zeichenkette in
  4874.                   einem Textstring ermitteln
  4875.        TXCODE  a) Textstring mit Hilfe einer Codetabelle verschlüsseln
  4876.                b) Textstring mit Hilfe einer Codetabelle entschlüsseln
  4877.        RECHTS  a) Text in einer Character-Variablen rechtsbündig formatieren
  4878.        UPCASE  a) Kleinbuchstaben eines Textstrings in Großbuchstaben umwandeln
  4879.        WOSUCH  a) Nummer eines Wortes in einem Textstring ermitteln
  4880.        ZAHL    a) Equivalenz eines Textstrings zum Integer- oder Realformat
  4881.                   testen
  4882.     
  4883.  
  4884.                                                                      Seite 114
  4885.  
  4886.  
  4887.        ╔═════════════════════════════════════════════════════════════════════╗
  4888.        ║Beschreibung der Subroutine ANZAHL (IN,ANZ)                          ║
  4889.        ║Die Subroutine stellt die Anzahl der in einem String "IN" vorhandenen║
  4890.        ║Worte fest und gibt sie in "ANZ" an das rufende Programm zurück. Die ║
  4891.        ║Characters Null [CHAR(0)] und Blank werden dabei als Separator       ║
  4892.        ║gewertet. Der String "IN" darf eine Länge von maximal 200 Zeichen    ║
  4893.        ║haben.                                                               ║
  4894.        ╟─────────────────────────────────────────────────────────────────────╢
  4895.        ║Parameter:                                                           ║
  4896.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  4897.        ║INTEGER          Return: Anzahl der gefundenen Worte                 ║
  4898.        ╟─────────────────────────────────────────────────────────────────────╢
  4899.        ║Beispiel:        CHARACTER IN*100                                    ║
  4900.        ║                 IN='Zu bearbeitender String: ANZAHL.FOR'            ║
  4901.        ║                 CALL ANZAHL (IN,IANZ)                               ║
  4902.        ║                 In der Variablen "IANZ" wird der Wert 4 als Anzahl  ║
  4903.        ║                 der gefundenen Worte zurückgegeben.                 ║
  4904.        ╚═════════════════════════════════════════════════════════════════════╝
  4905.     
  4906.  
  4907.                                                                      Seite 115
  4908.  
  4909.  
  4910.        ╔═════════════════════════════════════════════════════════════════════╗
  4911.        ║Beschreibung der Subroutine CHANGE (IN,STRIN,OUT,STROUT)             ║
  4912.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  4913.        ║werden Zeichenketten "STRIN" gegen Zeichenketten "STROUT"            ║
  4914.        ║ausgetauscht.                                                        ║
  4915.        ║Alle Strings dürfen eine Länge von maximal 200 Zeichen haben. Die    ║
  4916.        ║Strings "STRIN" und "STROUT" dürfen nicht als Substrings übergeben   ║
  4917.        ║werden. Es ist möglich, für die Strings "IN" und "OUT" dieselbe      ║
  4918.        ║Variable zu verwenden.                                               ║
  4919.        ╟─────────────────────────────────────────────────────────────────────╢
  4920.        ║Parameter:                                                           ║
  4921.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  4922.        ║CHARACTERSTRING  Zeichenkette, die ausgetauscht werden soll          ║
  4923.        ║                 [max. 200 Zeichen].                                 ║
  4924.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  4925.        ║CHARACTERSTRING  Zeichenkette, gegen die ausgetauscht werden soll    ║
  4926.        ║                 [max. 200 Zeichen].                                 ║
  4927.        ╟─────────────────────────────────────────────────────────────────────╢
  4928.        ║Subroutinen:     LAENGE                                              ║
  4929.        ╟─────────────────────────────────────────────────────────────────────╢
  4930.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  4931.        ║                 IN='Zu suchende Datei: CHANGE.FOR'                  ║
  4932.        ║                 CALL CHANGE (IN,'FOR',OUT,'EXE')                    ║
  4933.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  4934.        ║                 "Zu suchende Datei: CHANGE.EXE".                    ║
  4935.        ╚═════════════════════════════════════════════════════════════════════╝
  4936.     
  4937.  
  4938.                                                                      Seite 116
  4939.  
  4940.  
  4941.        ╔═════════════════════════════════════════════════════════════════════╗
  4942.        ║Beschreibung der Subroutine CHAWAL (IN,STRIN,OUT,STROUT)             ║
  4943.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  4944.        ║werden alle in "STRIN" vorkommenden Zeichen gegen die in "STROUT" an ║
  4945.        ║der gleichen Position stehenden Zeichen ausgetauscht. Zeichen, für   ║
  4946.        ║die in "STROUT" kein Äquivalent vorhanden ist, werden nur gelöscht.  ║
  4947.        ║Die Strings dürfen eine Länge von maximal 200 Zeichen haben.         ║
  4948.        ║Es ist möglich, für die Strings "IN" und "OUT" dieselbe Variable zu  ║
  4949.        ║verwenden.                                                           ║
  4950.        ╟─────────────────────────────────────────────────────────────────────╢
  4951.        ║Parameter:                                                           ║
  4952.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  4953.        ║CHARACTERSTRING  String mit auszutauschenden Zeichen                 ║
  4954.        ║                 [max. 200 Zeichen].                                 ║
  4955.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  4956.        ║CHARACTERSTRING  String mit Zeichen, gegen die ausgetauscht werden   ║
  4957.        ║                 soll [max. 200 Zeichen].                            ║
  4958.        ╟─────────────────────────────────────────────────────────────────────╢
  4959.        ║Subroutinen:     LAENGE                                              ║
  4960.        ╟─────────────────────────────────────────────────────────────────────╢
  4961.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  4962.        ║                 IN='Zu suchende Datei: CHAWAL.FOR'                  ║
  4963.        ║                 CALL CHAWAL (IN,'uei',0UT,'*#')                     ║
  4964.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  4965.        ║                 "Z* s*ch#nd# Dat#: CHAWAL.FOR".                     ║
  4966.        ╚═════════════════════════════════════════════════════════════════════╝
  4967.     
  4968.  
  4969.                                                                      Seite 117
  4970.  
  4971.  
  4972.        ╔═════════════════════════════════════════════════════════════════════╗
  4973.        ║Beschreibung der Subroutine CHAZEI (IN,ZEIKL,ZEIGR,OUT,ZEICHA)       ║
  4974.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  4975.        ║werden Zeichen größer/gleich "ZEIKL" und kleiner/gleich "ZEIGR" gegen║
  4976.        ║das Zeichen "ZEICHA" ausgetauscht. Wenn "ZEICHA" das Zeichen Null    ║
  4977.        ║[CHAR(0)] ist, wird das gefundene Zeichen nur gelöscht.              ║
  4978.        ║Die Strings "IN" und "OUT" dürfen eine Länge von maximal 200 Zeichen ║
  4979.        ║haben. "ZEIKL" muß lexikaligraphisch kleiner als "ZEIGR" sein.       ║
  4980.        ║"ZEIKL", "ZEIGR" und "ZEICHA" dürfen nur ein Zeichen lang sein.      ║
  4981.        ║Es ist möglich, für die Strings "IN" und "OUT" diselbe Variable zu   ║
  4982.        ║verwenden.                                                           ║
  4983.        ╟─────────────────────────────────────────────────────────────────────╢
  4984.        ║Parameter:                                                           ║
  4985.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  4986.        ║CHARACTER        Kleinstes auzutauschendes Zeichen.                  ║
  4987.        ║CHARACTER        Größtes auszutauschendes Zeichen.                   ║
  4988.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  4989.        ║CHARACTER        Zeichen, gegen das ausgetauscht werden soll oder    ║
  4990.        ║                 Null [CHAR (0)] wenn nur gelöscht werden soll.      ║
  4991.        ╟─────────────────────────────────────────────────────────────────────╢
  4992.        ║Subroutinen:     LAENGE                                              ║
  4993.        ╟─────────────────────────────────────────────────────────────────────╢
  4994.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  4995.        ║                 IN='Zu suchende Datei: CHAZEI.FOR'                  ║
  4996.        ║                 CALL CHAZEI (IN,'A','E',OUT,'*')                    ║
  4997.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  4998.        ║                 "Zu suchende *atei: *H*Z*I.*X*".                    ║
  4999.        ╚═════════════════════════════════════════════════════════════════════╝
  5000.     
  5001.  
  5002.                                                                      Seite 118
  5003.  
  5004.  
  5005.        ╔═════════════════════════════════════════════════════════════════════╗
  5006.        ║Beschreibung der Subroutine DEHN (IN,OUT,LAN)                        ║
  5007.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  5008.        ║werden die in "IN" enthaltenen Leerzeichen sooft vervielfacht, bis   ║
  5009.        ║das letzte Zeichen an der Position "LAN" steht. Wenn die Länge von   ║
  5010.        ║"IN" kleiner als 75% von "LAN" ist, wird "IN" unverändert in "OUT"   ║
  5011.        ║kopiert.                                                             ║
  5012.        ║Es ist möglich, für die Strings "IN" und "OUT" diselbe Variable zu   ║
  5013.        ║verwenden.                                                           ║
  5014.        ╟─────────────────────────────────────────────────────────────────────╢
  5015.        ║Parameter:                                                           ║
  5016.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5017.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  5018.        ║INTEGER          Position, an der das letzte Zeichen stehen soll     ║
  5019.        ║                 [max. 200].                                         ║
  5020.        ╟─────────────────────────────────────────────────────────────────────╢
  5021.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  5022.        ║                 IN='Zu suchende Datei: DEHN.FOR'                    ║
  5023.        ║                 CALL DEHN (IN,OUT,35)                               ║
  5024.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  5025.        ║                 "Zu    suchende    Datei:   DEHN.FOR".              ║
  5026.        ╚═════════════════════════════════════════════════════════════════════╝
  5027.     
  5028.  
  5029.                                                                      Seite 119
  5030.  
  5031.  
  5032.        ╔═════════════════════════════════════════════════════════════════════╗
  5033.        ║Beschreibung der Subroutine DELETE (IN,OUT,STRIN)                    ║
  5034.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  5035.        ║werden Zeichenketten "STRIN" herausgefiltert.                        ║
  5036.        ║Alle Strings dürfen eine Länge von maximal 200 Zeichen haben. Der    ║
  5037.        ║String "STRIN" darf nicht als Substring übergeben werden. Es ist     ║
  5038.        ║möglich, für die Strings "IN" und "OUT" dieselbe Variable zu         ║
  5039.        ║verwenden.                                                           ║
  5040.        ╟─────────────────────────────────────────────────────────────────────╢
  5041.        ║Parameter:                                                           ║
  5042.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5043.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  5044.        ║CHARACTERSTRING  Zeichenkette, die herausgefiltert werden soll       ║
  5045.        ║                 [max. 200 Zeichen].                                 ║
  5046.        ╟─────────────────────────────────────────────────────────────────────╢
  5047.        ║Subroutinen:     LAENGE                                              ║
  5048.        ╟─────────────────────────────────────────────────────────────────────╢
  5049.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  5050.        ║                 IN='Zu suchende Datei: DELETE.FOR'                  ║
  5051.        ║                 CALL DELETE (IN,OUT,'Datei')                        ║
  5052.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  5053.        ║                 "Zu suchende : DELETE.FOR".                         ║
  5054.        ╚═════════════════════════════════════════════════════════════════════╝
  5055.     
  5056.  
  5057.                                                                      Seite 120
  5058.  
  5059.  
  5060.        ╔═════════════════════════════════════════════════════════════════════╗
  5061.        ║Beschreibung der Subroutine FUEG (IN,STRIN,OUT,POS)                  ║
  5062.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  5063.        ║wird die Zeichenkette "STRIN" hinter der Position "POS" eingefügt.   ║
  5064.        ║Alle Strings dürfen eine Länge von maximal 200 Zeichen haben. Der    ║
  5065.        ║String "STRIN" darf nicht als Substring übergeben werden. Es ist     ║
  5066.        ║möglich, für die Strings "IN" und "OUT" dieselbe Variable zu         ║
  5067.        ║verwenden.                                                           ║
  5068.        ╟─────────────────────────────────────────────────────────────────────╢
  5069.        ║Parameter:                                                           ║
  5070.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5071.        ║CHARACTERSTRING  Zeichenkette, die eingefügt werden soll             ║
  5072.        ║                 [max. 200 Zeichen].                                 ║
  5073.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  5074.        ║INTEGER          Position, hinter die eingefügt werden soll          ║
  5075.        ║                 [max. 199].                                         ║
  5076.        ╟─────────────────────────────────────────────────────────────────────╢
  5077.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  5078.        ║                 IN='Zu suchende Datei: FUEG.FOR'                    ║
  5079.        ║                 CALL FUEG (IN,'FORTRAN-',OUT,12)                    ║
  5080.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  5081.        ║                 "Zu suchende FORTRAN-Datei: FUEG.FOR".              ║
  5082.        ╚═════════════════════════════════════════════════════════════════════╝
  5083.     
  5084.  
  5085.                                                                      Seite 121
  5086.  
  5087.  
  5088.        ╔═════════════════════════════════════════════════════════════════════╗
  5089.        ║Beschreibung der Subroutine GETWOR (IN,ANZ,STROUT)                   ║
  5090.        ║Die Subroutine schreibt das in "ANZ" angeforderte Wort aus der       ║
  5091.        ║Zeichenkette "IN" in die Variable "STROUT". Die Strings dürfen eine  ║
  5092.        ║Länge von maximal 200 Zeichen haben. Die Nummer des gewünschten      ║
  5093.        ║Wortes wird in "ANZ" übergeben. Wenn die Anzahl Wörter in "IN" nicht ║
  5094.        ║vorhanden ist, wird in "ANZ" 0 zurückgegeben.                        ║
  5095.        ╟─────────────────────────────────────────────────────────────────────╢
  5096.        ║Parameter:                                                           ║
  5097.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5098.        ║INTEGER          Wortzähler                                          ║
  5099.        ║                 Return: 0 wenn Anzahl Wörter nicht vorhanden ist    ║
  5100.        ║CHARACTERSTRING  Return: Gesuchtes Wort [max. 200 Zeichen]           ║
  5101.        ╟─────────────────────────────────────────────────────────────────────╢
  5102.        ║Subroutinen:     FUEG,POSIT,NEXT                                     ║
  5103.        ╟─────────────────────────────────────────────────────────────────────╢
  5104.        ║Beispiel:        CHARACTER IN*100,STROUT*40                          ║
  5105.        ║                 IN='Zu suchende Datei: GETWOR.FOR'                  ║
  5106.        ║                 CALL GETWOR (IN,3,STROUT)                           ║
  5107.        ║                 In der Variablen "STROUT" wird der Text "Datei"     ║
  5108.        ║                 zurückgegeben.                                      ║
  5109.        ╚═════════════════════════════════════════════════════════════════════╝
  5110.     
  5111.  
  5112.                                                                      Seite 122
  5113.  
  5114.  
  5115.        ╔═════════════════════════════════════════════════════════════════════╗
  5116.        ║Beschreibung der Subroutine LAENGE (IN,LAN)                          ║
  5117.        ║Die Subroutine stellt die Position des letzten Zeichens in "IN" fest ║
  5118.        ║und gibt sie in "LAN" an das rufende Programm zurück. Die Characters ║
  5119.        ║Null [CHAR(0)] und Blank werden dabei nicht als Zeichen gewertet.    ║
  5120.        ║Der String "IN" darf eine Länge von maximal 200 Zeichen haben.       ║
  5121.        ╟─────────────────────────────────────────────────────────────────────╢
  5122.        ║Parameter:                                                           ║
  5123.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5124.        ║INTEGER          Return: Position des letzten Zeichens               ║
  5125.        ╟─────────────────────────────────────────────────────────────────────╢
  5126.        ║Beispiel:        CHARACTER IN*100                                    ║
  5127.        ║                 IN='Zu suchende Datei: LAENGE.FOR          '        ║
  5128.        ║                 CALL LAENGE (IN,IPOS)                               ║
  5129.        ║                 In der Variablen "IPOS" wird der Wert 29 als        ║
  5130.        ║                 Position des letzten Zeichens zurückgegeben.        ║
  5131.        ╚═════════════════════════════════════════════════════════════════════╝
  5132.     
  5133.  
  5134.                                                                      Seite 123
  5135.  
  5136.  
  5137.        ╔═════════════════════════════════════════════════════════════════════╗
  5138.        ║Beschreibung der Subroutine NEXT (IN,POS)                            ║
  5139.        ║Die Subroutine stellt die Position des nächsten Wortes in einer      ║
  5140.        ║Zeichenkette "IN" fest. Die Position wird in "POS" an das rufende    ║
  5141.        ║Programm zurückgegeben. Das am Anfang der Zeichenkette stehende Wort ║
  5142.        ║und die nachfolgenden Blanks und Null-Characters werden überlesen,   ║
  5143.        ║so daß die Position des ersten Zeichens im nachfolgenden Wort in     ║
  5144.        ║"POS" übergeben wird. Wenn das nächste Wort in der Zeichenkette nicht║
  5145.        ║vorhanden ist, wird in "POS" 0 zurückgegeben.                        ║
  5146.        ╟─────────────────────────────────────────────────────────────────────╢
  5147.        ║Parameter:                                                           ║
  5148.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5149.        ║INTEGER          Return: Position des nächsten Wortes                ║
  5150.        ╟─────────────────────────────────────────────────────────────────────╢
  5151.        ║Subroutinen:     LAENGE                                              ║
  5152.        ╟─────────────────────────────────────────────────────────────────────╢
  5153.        ║Beispiel:        CHARACTER IN*100                                    ║
  5154.        ║                 IN='Zu suchende Datei: NEXT.FOR'                    ║
  5155.        ║                 CALL NEXT (IN,IPOS)                                 ║
  5156.        ║                 In der Variablen "IPOS" wird der Wert 4 als         ║
  5157.        ║                 Position für das erste Zeichen im nächsten Wort an  ║
  5158.        ║                 das rufende Programm übergeben.                     ║
  5159.        ╚═════════════════════════════════════════════════════════════════════╝
  5160.     
  5161.  
  5162.                                                                      Seite 124
  5163.  
  5164.  
  5165.        ╔═════════════════════════════════════════════════════════════════════╗
  5166.        ║Beschreibung der Subroutine POSIT (IN,POS,STRIN,IND)                 ║
  5167.        ║Die Subroutine stellt die Position der Zeichenkette "STRIN" in der   ║
  5168.        ║Zeichenkette "IN" fest. Die Position wird in "POS" an das rufende    ║
  5169.        ║Programm zurückgegeben. Wenn der Indikator "IND" 1 gesetzt ist, wird ║
  5170.        ║nach dem letztmaligen Auftreten in "IN" gesucht, wenn "IND" 0 gesetzt║
  5171.        ║ist, wird nach dem erstmaligen Auftreten gesucht. Wenn "STRIN" in    ║
  5172.        ║"IN" nicht vorhanden ist, wird in "POS" 0 zurückgegeben. "STRIN" darf║
  5173.        ║nicht als Substring übergeben werden.                                ║
  5174.        ╟─────────────────────────────────────────────────────────────────────╢
  5175.        ║Parameter:                                                           ║
  5176.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5177.        ║INTEGER          Return: Position des Suchstrings                    ║
  5178.        ║CHARACTERSTRING  Zeichenkette, deren Position festgestellt werden    ║
  5179.        ║                 soll [max. 200 Zeichen].                            ║
  5180.        ║INTEGER          Indikator: 0: Es wird nach dem erstmaligen Auftreten║
  5181.        ║                               gesucht.                              ║
  5182.        ║                            1: Es wird nach dem letztmaligen         ║
  5183.        ║                               Auftreten gesucht.                    ║
  5184.        ╟─────────────────────────────────────────────────────────────────────╢
  5185.        ║Beispiel:        CHARACTER IN*100                                    ║
  5186.        ║                 IN='Zu suchende Datei: POSIT.FOR'                   ║
  5187.        ║                 CALL POSIT (IN,IPOS,'POSIT',1)                      ║
  5188.        ║                 In der Variablen "IPOS" wird der Wert 20 als        ║
  5189.        ║                 Position für das letztmalige Auftreten des          ║
  5190.        ║                 Suchstrings an das rufende Programm übergeben.      ║
  5191.        ╚═════════════════════════════════════════════════════════════════════╝
  5192.     
  5193.  
  5194.                                                                      Seite 125
  5195.  
  5196.  
  5197.        ╔═════════════════════════════════════════════════════════════════════╗
  5198.        ║Beschreibung der Subroutine RECHTS (IN,OUT,LAN)                      ║
  5199.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  5200.        ║werden die in "IN" enthaltene String rechtsbündig in die Variable    ║
  5201.        ║"OUT" kopiert.                                                       ║
  5202.        ║Es ist möglich, für die Strings "IN" und "OUT" diselbe Variable zu   ║
  5203.        ║verwenden.                                                           ║
  5204.        ╟─────────────────────────────────────────────────────────────────────╢
  5205.        ║Parameter:                                                           ║
  5206.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5207.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  5208.        ║INTEGER          Position, an der das letzte Zeichen stehen soll     ║
  5209.        ║                 [max. 200].                                         ║
  5210.        ╟─────────────────────────────────────────────────────────────────────╢
  5211.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  5212.        ║                 IN='RECHTS.FOR'                                     ║
  5213.        ║                 CALL RECHTS (IN,OUT,20)                             ║
  5214.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  5215.        ║                 "          RECHTS.FOR".                             ║
  5216.        ╚═════════════════════════════════════════════════════════════════════╝
  5217.     
  5218.  
  5219.                                                                      Seite 126
  5220.  
  5221.  
  5222.        ╔═════════════════════════════════════════════════════════════════════╗
  5223.        ║Beschreibung der Subroutine TXCODE (IN,OUT,CODE,ART)                 ║
  5224.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  5225.        ║werden alle Kleinbuchstaben, Großbuchstaben und Ziffern mit Hilfe    ║
  5226.        ║einer Codetabelle "CODE" umgewandelt. Wenn in "ART" eine Null steht, ║
  5227.        ║wird verschlüsselt, eine Eins wird zum entschlüsseln übergeben.      ║
  5228.        ║Ein- und Ausgabestrings dürfen eine Länge von maximal 200 Zeichen    ║
  5229.        ║haben. Es ist möglich, für die Strings "IN" und "OUT" dieselbe       ║
  5230.        ║Variable zu verwenden.                                               ║
  5231.        ╟─────────────────────────────────────────────────────────────────────╢
  5232.        ║Parameter:                                                           ║
  5233.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5234.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  5235.        ║CHARACTERSTRING  Codetabelle  [69 Zeichen!].                         ║
  5236.        ║                 In der Codetabelle stehen in der richtigen          ║
  5237.        ║                 Reihenfolge Zeichen, gegen die ausgetauscht werden  ║
  5238.        ║                 soll.                                               ║
  5239.        ║                 Die Zeichen  1 bis 10 stehen für die Ziffern 0 bis 9║
  5240.        ║                 Die Zeichen 11 bis 36 stehen für die Zeichen A bis Z║
  5241.        ║                 Die Zeichen 37 bis 62 stehen für die Zeichen a bis z║
  5242.        ║                 Die Zeichen 63 bis 69 stehen für die Zeichen ÄÖÜäöüß║
  5243.        ║                 Die Codetabelle muß EINDEUTIG sein, um den Text     ║
  5244.        ║                 wieder fehlerfrei entschlüsseln zu können (d. h.    ║
  5245.        ║                 jedes Zeichen darf in der Codetabelle nur einmal    ║
  5246.        ║                 vorhanden sein, alle 69 Zeichen müssen eingetragen  ║
  5247.        ║                 sein, es dürfen nur die o. g. Zeichen verwendet     ║
  5248.        ║                 werden).                                            ║
  5249.        ║INTEGER          Art der Codewandlung.                               ║
  5250.        ║                 0: verschlüsseln                                    ║
  5251.        ║                 1: entschlüsseln                                    ║
  5252.        ╟─────────────────────────────────────────────────────────────────────╢
  5253.        ║Subroutinen:     LAENGE                                              ║
  5254.        ╟─────────────────────────────────────────────────────────────────────╢
  5255.        ║Beispiel:        CHARACTER IN*100,OUT*80,CODE*38                     ║
  5256.        ║                 DATA CODE(1:32) /'9876543210QWERTZUIOPVASDFGHJKLBN'/║
  5257.        ║                 DATA CODE(33:69) /'YXCMmnbvcxylkjhgfdsapoiuztrewqß'/║
  5258.        ║                 DATA CODE(64:69) /'üöäÜÖÄ'/                         ║
  5259.        ║                 IN='ZU VERSCHLÜSSELNDER TEXT'                       ║
  5260.        ║                 CALL TXCODE (IN,OUT,CODE,0)                         ║
  5261.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  5262.        ║                 "VB NTJKEIAöKKTADRTJ LTXL".                         ║
  5263.        ╚═════════════════════════════════════════════════════════════════════╝
  5264.     
  5265.  
  5266.                                                                      Seite 127
  5267.  
  5268.  
  5269.        ╔═════════════════════════════════════════════════════════════════════╗
  5270.        ║Beschreibung der Subroutine UPCASE (IN,OUT)                          ║
  5271.        ║Die Subroutine kopiert den String "IN" in den String "OUT". Dabei    ║
  5272.        ║werden alle Kleinbuchstaben in Großbuchstaben umgewandelt.           ║
  5273.        ║Die Strings dürfen eine Länge von maximal 200 Zeichen haben.         ║
  5274.        ║Es ist möglich, für die Strings "IN" und "OUT" dieselbe Variable zu  ║
  5275.        ║verwenden.                                                           ║
  5276.        ╟─────────────────────────────────────────────────────────────────────╢
  5277.        ║Parameter:                                                           ║
  5278.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5279.        ║CHARACTERSTRING  Return: Ausgabestring [max. 200 Zeichen].           ║
  5280.        ╟─────────────────────────────────────────────────────────────────────╢
  5281.        ║Subroutinen:     LAENGE                                              ║
  5282.        ╟─────────────────────────────────────────────────────────────────────╢
  5283.        ║Beispiel:        CHARACTER IN*100,OUT*80                             ║
  5284.        ║                 IN='Zu suchende Datei: UPCASE.FOR'                  ║
  5285.        ║                 CALL UPCASE (IN,OUT)                                ║
  5286.        ║                 Der Text in der Variablen "OUT" ist nun:            ║
  5287.        ║                 "ZU SUCHENDE DATEI: UPCASE.FOR".                    ║
  5288.        ╚═════════════════════════════════════════════════════════════════════╝
  5289.     
  5290.  
  5291.                                                                      Seite 128
  5292.  
  5293.  
  5294.        ╔═════════════════════════════════════════════════════════════════════╗
  5295.        ║Beschreibung der Subroutine WOSUCH (IN,STRIN,ANZ)                    ║
  5296.        ║Die Subroutine stellt fest, um das wievielte Wort in der Zeichenkette║
  5297.        ║"IN" es sich bei der in "STRIN" übergebenen Zeichenkette handelt.    ║
  5298.        ║Alle Strings dürfen eine Länge von maximal 200 Zeichen haben. Die    ║
  5299.        ║Nummer des gesuchten Wortes wird in "ANZ" zurückgegeben. Wenn das    ║
  5300.        ║Wort nicht gefunden wird, enthält "ANZ" eine 0.                      ║
  5301.        ╟─────────────────────────────────────────────────────────────────────╢
  5302.        ║Parameter:                                                           ║
  5303.        ║CHARACTERSTRING  Eingabestring [max. 200 Zeichen].                   ║
  5304.        ║CHARACTERSTRING  Suchstring [max. 200 Zeichen].                      ║
  5305.        ║INTEGER          Return: Wortzähler                                  ║
  5306.        ╟─────────────────────────────────────────────────────────────────────╢
  5307.        ║Subroutinen:     LAENGE,NEXT                                         ║
  5308.        ╟─────────────────────────────────────────────────────────────────────╢
  5309.        ║Beispiel:        CHARACTER IN*100                                    ║
  5310.        ║                 IN='Zu suchende Datei: WOSUCH.FOR'                  ║
  5311.        ║                 CALL WOSUCH (IN,'Datei',ANZ)                        ║
  5312.        ║                 In der Variablen "ANZ" wird der Wert 3              ║
  5313.        ║                 zurückgegeben.                                      ║
  5314.        ╚═════════════════════════════════════════════════════════════════════╝
  5315.     
  5316.  
  5317.                                                                      Seite 129
  5318.  
  5319.  
  5320.        ╔═════════════════════════════════════════════════════════════════════╗
  5321.        ║Beschreibung der Subroutine ZAHL (IN,IND)                            ║
  5322.        ║Die Subroutine stellt fest, ob im String "IN" eine in Integer- oder  ║
  5323.        ║Realvariablen konvertierbare Zeichenfolge vorhanden ist und gibt ein ║
  5324.        ║entsprechendes Flag an das rufende Programm zurück. Die von der      ║
  5325.        ║Routine berücksichtigten Maximalformate sind für Integer I11 und für ║
  5326.        ║Real F20.9.                                                          ║
  5327.        ╟─────────────────────────────────────────────────────────────────────╢
  5328.        ║Parameter:                                                           ║
  5329.        ║CHARACTERSTRING  Eingabestring                                       ║
  5330.        ║INTEGER          Return: Indikator für Konvertierbarkeit             ║
  5331.        ║                         0: nicht konvertierbar oder Wert zu groß    ║
  5332.        ║                         1: nach Integer konvertierbar               ║
  5333.        ║                         2: nach Real konvertierbar                  ║
  5334.        ║                         3: nach Real und nach Integer konvertierbar ║
  5335.        ╟─────────────────────────────────────────────────────────────────────╢
  5336.        ║Subroutinen:     LAENGE                                              ║
  5337.        ╟─────────────────────────────────────────────────────────────────────╢
  5338.        ║Beispiel:        CHARACTER IN*100                                    ║
  5339.        ║                 IN='-12345.66666'                                   ║
  5340.        ║                 CALL ZAHL (IN,I)                                    ║
  5341.        ║                 In der Variablen "I" wird eine 2 zurückgegeben, da  ║
  5342.        ║                 der String nach Real konvertierbar ist.             ║
  5343.        ╚═════════════════════════════════════════════════════════════════════╝
  5344.     
  5345.  
  5346.                                                                      Seite 130
  5347.  
  5348.  
  5349.        Laufwerks-, Verzeichnis- und Dateimanipulationen
  5350.  
  5351.        Mit dieser Gruppe von Subroutinen können Informationen über Laufwerke,
  5352.        Verzeichnisse und Dateien ermittelt werden.  Daneben sind Wechsel in
  5353.        andere Laufwerke oder Verzeichnisse und das Anlegen und Löschen von
  5354.        Verzeichnissen möglich. Wichtig ist die Möglichkeit, aus einem Programm
  5355.        heraus sämtliche Dateimanipulationen wie Kopieren, Moven und Löschen
  5356.        optimiert ausführen zu können.
  5357.  
  5358.        Besondere Bedeutung kommt der Subroutine "DFIND" zu, die alle Laufwerke
  5359.        und Verzeichnisse eines Personal-Computers rekursiv nach Dateien oder
  5360.        Dateigruppen durchsuchen kann.  Dadurch ist es möglich, vom Programm
  5361.        benötigte Dateien vor dem Öffnen im gesamten System zu suchen und zu
  5362.        finden.  So werden Programme, die Hilfsdateien benötigen, vom
  5363.        Verzeichnis unabhängig.
  5364.  
  5365.        Dateiinformationen können von allen Dateiformen, wie versteckten
  5366.        Dateien, Systemdateien, Verzeichnissen -die unter DOS nichts anderes als
  5367.        Dateien sind- und sogar von der Datenträgerkennung ermittelt werden.  Zu
  5368.        den Dateiinformationen gehören neben dem Dateinamen der Dateipfad,
  5369.        Erzeugungsdatum und -zeit, die Dateiattribute und die Dateigröße.
  5370.  
  5371.  
  5372.        Subroutinen zu Laufwerks-, Verzeichnis- und Dateimanipulationen
  5373.  
  5374.        LAUFW   a) Alle Laufwerke im System feststellen
  5375.        LAUFD   a) Aktuelles Laufwerk feststellen
  5376.        LAUFK   a) Typ eines Laufwerks feststellen
  5377.        LAUFC   a) Wechsel des aktuellen Laufwerks
  5378.        DISKSP  a) Freien Speicherplatz des aktuellen Laufwerks ermitteln
  5379.                b) Freien Speicherplatz eines beliebigen Laufwerks ermitteln
  5380.                c) Betriebsbereitschaft eines Laufwerks kontrollieren
  5381.        GETVER  a) Pfad und Namen des aktuellen Verzeichnisses ermitteln
  5382.        SETVER  a) Wechsel des aktuellen Verzeichnisses
  5383.        CREVER  a) Anlegen eines neuen Verzeichnisses
  5384.        DELVER  a) Löschen eines Verzeichnisses
  5385.        DSUCH   a) Dateiensuche in einem Verzeichnis
  5386.        LFIND   a) Dateiensuche in allen Verzeichnissen eines Laufwerks unter
  5387.                   Berücksichtigung der Dateiattribute
  5388.        DFIND   a) Dateiensuche in allen Verzeichnissen aller Laufwerke des
  5389.                   Systems
  5390.        DINFO   a) Dateispezifische Informationen ermitteln
  5391.        DATEI   a) Quelldatei kopieren wenn Zieldatei nicht vorhanden ist
  5392.                b) Quelldatei kopieren wenn Zieldatei vorhanden ist
  5393.                c) Quelldatei bewegen wenn Zieldatei nicht vorhanden ist
  5394.                d) Quelldatei bewegen wenn Zieldatei vorhanden ist
  5395.                e) Datei verschlüsseln
  5396.                f) Datei entschlüsseln
  5397.                g) Dateiattribute setzen
  5398.                h) Dateiattribute zurücksetzen
  5399.                i) Datei löschen
  5400.                j) Dateiinhalt mit Nullcharacters überschreiben und anschließend
  5401.                   löschen
  5402.     
  5403.  
  5404.                                                                      Seite 131
  5405.  
  5406.  
  5407.        ╔══════════════════════════════════════════════════════════════════════╗
  5408.        ║Beschreibung der Subroutine LAUFW (STRING,ANZ)                        ║
  5409.        ║Die Subroutine ermittelt alle in einem System gültigen Laufwerke.     ║
  5410.        ║Die Kennbuchstaben der gefundenen Laufwerke werden in den             ║
  5411.        ║Characterstring "STRING" geschrieben. Es werden physikalische,        ║
  5412.        ║logische und substituierte Laufwerke aufgeführt. In "ANZ" wird die    ║
  5413.        ║Anzahl der zu findenden Laufwerke begrenzt. Die Anzahl der tatsächlich║
  5414.        ║gefundenen Laufwerke wird in der Variablen zurückgegeben. Die im      ║
  5415.        ║"STRING" nicht mit Laufwerkskennungen beschriebenen Bytes werden mit  ║
  5416.        ║Blanks überschrieben.                                                 ║
  5417.        ╟──────────────────────────────────────────────────────────────────────╢
  5418.        ║Parameter:                                                            ║
  5419.        ║CHARACTERSTRING  Return: String mit Kennbuchstaben der gefundenen     ║
  5420.        ║                 Laufwerke [ STRING*ANZ ]                             ║
  5421.        ║INTEGER          Maximale Anzahl der zu suchenden Laufwerke           ║
  5422.        ║                 Return: Anzahl der tatsächlich gefundenen Laufwerke  ║
  5423.        ╟──────────────────────────────────────────────────────────────────────╢
  5424.        ║Beispiel:        CHARACTER LW*10                                      ║
  5425.        ║                 I=10                                                 ║
  5426.        ║                 CALL LAUFW (LW,I)                                    ║
  5427.        ║                 Es werden bis zu zehn gültige Laufwerke ermittelt.   ║
  5428.        ║                 Die Kennbuchstaben der gefundenen Laufwerke werden in║
  5429.        ║                 der Charactervariablen "LW" zurückgegeben. In "I"    ║
  5430.        ║                 steht die Anzahl der tatsächlich gefundenen          ║
  5431.        ║                 Laufwerke.                                           ║
  5432.        ╚══════════════════════════════════════════════════════════════════════╝
  5433.     
  5434.  
  5435.                                                                      Seite 132
  5436.  
  5437.  
  5438.        ╔══════════════════════════════════════════════════════════════════════╗
  5439.        ║Beschreibung der Subroutine LAUFD (LW)                                ║
  5440.        ║Die Subroutine gibt in der Charactervariablen "LW" den Kenn-          ║
  5441.        ║buchstaben des aktuellen Laufwerks zurück.                            ║
  5442.        ╟──────────────────────────────────────────────────────────────────────╢
  5443.        ║Parameter:                                                            ║
  5444.        ║CHARACTER        Return: Kennbuchstabe des aktuellen Laufwerks.       ║
  5445.        ╟──────────────────────────────────────────────────────────────────────╢
  5446.        ║Beispiel:        CHARACTER LW                                         ║
  5447.        ║                 CALL LAUFD (LW)                                      ║
  5448.        ║                 WRITE (*,'(1X,A)') LW                                ║
  5449.        ║                 Die Routine schreibt den Kennbuchstaben des aktuellen║
  5450.        ║                 Laufwerks auf den Bildschirm.                        ║
  5451.        ╚══════════════════════════════════════════════════════════════════════╝
  5452.     
  5453.  
  5454.                                                                      Seite 133
  5455.  
  5456.  
  5457.        ╔══════════════════════════════════════════════════════════════════════╗
  5458.        ║Beschreibung der Subroutine LAUFC (LW)                                ║
  5459.        ║Die Subroutine wechselt in das in der Charactervariablen "LW" als     ║
  5460.        ║Laufwerkskennbuchstaben übergebene Laufwerk.                          ║
  5461.        ╟──────────────────────────────────────────────────────────────────────╢
  5462.        ║Parameter:                                                            ║
  5463.        ║CHARACTER        Kennbuchstabe des neuen Laufwerks.                   ║
  5464.        ╟──────────────────────────────────────────────────────────────────────╢
  5465.        ║Beispiel:        CHARACTER LW                                         ║
  5466.        ║                 LW='D'                                               ║
  5467.        ║                 CALL LAUFC (LW)                                      ║
  5468.        ║                 CALL LAUFD (LW)                                      ║
  5469.        ║                 WRITE (*,'(1X,A)') LW                                ║
  5470.        ║                 Mit der Subroutine LAUFC wird in das Laufwerk D:     ║
  5471.        ║                 gewechselt. Zur Kontrolle wird mit der Subroutine    ║
  5472.        ║                 LAUFD das aktuelle Laufwerk erfragt und am Bildschirm║
  5473.        ║                 ausgegeben.                                          ║
  5474.        ╚══════════════════════════════════════════════════════════════════════╝
  5475.     
  5476.  
  5477.                                                                      Seite 134
  5478.  
  5479.  
  5480.        ╔══════════════════════════════════════════════════════════════════════╗
  5481.        ║Beschreibung der Subroutine LAUFK (LW,TYP)                            ║
  5482.        ║Die Subroutine stellt den Typ des in "LW" übergebenen Laufwerks fest  ║
  5483.        ║und gibt ihn in "TYP" an das rufende Programm zurück.                 ║
  5484.        ╟──────────────────────────────────────────────────────────────────────╢
  5485.        ║Parameter:                                                            ║
  5486.        ║CHARACTER        Kennbuchstabe des zu untersuchenden Laufwerks.       ║
  5487.        ║INTEGER          Return: Typ des Laufwerks:                           ║
  5488.        ║                 0: Festplattenlaufwerk oder RAM-Disk                 ║
  5489.        ║                 1: Diskettenlaufwerk                                 ║
  5490.        ║                 2: Serverlaufwerk                                    ║
  5491.        ║                 3: ungültiges Laufwerk                               ║
  5492.        ╟──────────────────────────────────────────────────────────────────────╢
  5493.        ║Beispiel:        CHARACTER LW                                         ║
  5494.        ║                 CALL LAUFK ('C',TYP)                                 ║
  5495.        ║                 WRITE (*,'(1X,I1)') TYP                              ║
  5496.        ║                 Die Routine schreibt den Typ des Laufwerks C: in     ║
  5497.        ║                 Form eines Falge auf den Bildschirm.                 ║
  5498.        ╚══════════════════════════════════════════════════════════════════════╝
  5499.     
  5500.  
  5501.                                                                      Seite 135
  5502.  
  5503.  
  5504.        ╔══════════════════════════════════════════════════════════════════════╗
  5505.        ║Beschreibung der Subroutine GETVER (VERZ,FLAG)                        ║
  5506.        ║Die Subroutine schreibt den Pfad und den Namen des aktuellen          ║
  5507.        ║Verzeichnisses in den Characterstring "VERZ". Bei einem Fehler wird   ║
  5508.        ║in "FLAG" eine Eins, sonst eine Null zurückgegeben.                   ║
  5509.        ╟──────────────────────────────────────────────────────────────────────╢
  5510.        ║Parameter:                                                            ║
  5511.        ║CHARACTERSTRING  [ 64 Characters! ]                                   ║
  5512.        ║                 Return: Pfad und Name des aktuellen Verzeichnisses   ║
  5513.        ║                 den DOS-Konventionen entsprechend.                   ║
  5514.        ║INTEGER          Return: Fehlerflag.                                  ║
  5515.        ║                 0: Funktion erfolgreich abgeschlossen                ║
  5516.        ║                 1: Ein Fehler ist aufgetreten                        ║
  5517.        ╟──────────────────────────────────────────────────────────────────────╢
  5518.        ║Beispiel:        INTEGER FLAG                                         ║
  5519.        ║                 CHARACTER VERZ*64                                    ║
  5520.        ║                 CALL GETVER (VERZ,FLAG)                              ║
  5521.        ║                 Wenn in "FLAG" eine Null zurückgegeben wurde, steht  ║
  5522.        ║                 in "VERZ" der Pfad und Name des aktuellen            ║
  5523.        ║                 Verzeichnisses zur Verfügung.                        ║
  5524.        ╚══════════════════════════════════════════════════════════════════════╝
  5525.     
  5526.  
  5527.                                                                      Seite 136
  5528.  
  5529.  
  5530.        ╔══════════════════════════════════════════════════════════════════════╗
  5531.        ║Beschreibung der Subroutine SETVER (VERZ,FLAG)                        ║
  5532.        ║Die Subroutine wechselt das aktuelle Verzeichnis. Beim Auftreten eines║
  5533.        ║Fehlers wird in "FLAG" eine Eins, sonst eine Null übergeben.          ║
  5534.        ╟──────────────────────────────────────────────────────────────────────╢
  5535.        ║Parameter:                                                            ║
  5536.        ║CHARACTERSTRING  [LAUFWERK]//[PFAD]//VERZEICHNIS//CHAR(0)             ║
  5537.        ║                 Laufwerk, Pfad und Verzeichnisname den DOS-          ║
  5538.        ║                 Konventionen entsprechend. Der String muß mit einem  ║
  5539.        ║                 Nullcharacter abgeschlossen sein.                    ║
  5540.        ║INTEGER          Return: Fehlerflag.                                  ║
  5541.        ║                 0: Funktion erfolgreich abgeschlossen                ║
  5542.        ║                 1: Ein Fehler ist aufgetreten                        ║
  5543.        ╟──────────────────────────────────────────────────────────────────────╢
  5544.        ║Beispiel:        INTEGER FLAG                                         ║
  5545.        ║                 CALL SETVER ('D:\FORTRAN\LIB'//CHAR(0),FLAG)         ║
  5546.        ║                 Wenn in "FLAG" eine Null zurückgegeben wurde, ist das║
  5547.        ║                 aktuelle Verzeichnis nun D:\FORTRAN\LIB.             ║
  5548.        ╚══════════════════════════════════════════════════════════════════════╝
  5549.     
  5550.  
  5551.                                                                      Seite 137
  5552.  
  5553.  
  5554.        ╔══════════════════════════════════════════════════════════════════════╗
  5555.        ║Beschreibung der Subroutine CREVER (VERZ,FLAG)                        ║
  5556.        ║Die Subroutine legt ein neues Verzeichnis an. Beim Auftreten eines    ║
  5557.        ║Fehlers wird in "FLAG" eine Eins, sonst eine Null übergeben.          ║
  5558.        ╟──────────────────────────────────────────────────────────────────────╢
  5559.        ║Parameter:                                                            ║
  5560.        ║CHARACTERSTRING  [LAUFWERK]//[PFAD]//VERZEICHNIS//CHAR(0)             ║
  5561.        ║                 Laufwerk, Pfad und Verzeichnisname den DOS-          ║
  5562.        ║                 Konventionen entsprechend. Der String muß mit einem  ║
  5563.        ║                 Nullcharacter abgeschlossen sein.                    ║
  5564.        ║INTEGER          Return: Fehlerflag.                                  ║
  5565.        ║                 0: Funktion erfolgreich abgeschlossen                ║
  5566.        ║                 1: Ein Fehler ist aufgetreten                        ║
  5567.        ╟──────────────────────────────────────────────────────────────────────╢
  5568.        ║Beispiel:        INTEGER FLAG                                         ║
  5569.        ║                 CALL CREVER ('D:\FORTRAN\LIB'//CHAR(0),FLAG)         ║
  5570.        ║                 Wenn in "FLAG" eine Null zurückgegeben wurde, ist das║
  5571.        ║                 Verzeichnis D:\FORTRAN\LIB angelegt worden.          ║
  5572.        ╚══════════════════════════════════════════════════════════════════════╝
  5573.     
  5574.  
  5575.                                                                      Seite 138
  5576.  
  5577.  
  5578.        ╔══════════════════════════════════════════════════════════════════════╗
  5579.        ║Beschreibung der Subroutine DELVER (VERZ,FLAG)                        ║
  5580.        ║Die Subroutine löscht ein Verzeichnis. Das zu löschende Verzeichnis   ║
  5581.        ║darf keine Dateieinträge enthalten. Es darf nicht das aktuelle        ║
  5582.        ║Verzeichnis sein. Beim Auftreten eines Fehlers wird in "FLAG" eine    ║
  5583.        ║Eins, sonst eine Null zurückgegeben.                                  ║
  5584.        ╟──────────────────────────────────────────────────────────────────────╢
  5585.        ║Parameter:                                                            ║
  5586.        ║CHARACTERSTRING  [LAUFWERK]//[PFAD]//VERZEICHNIS//CHAR(0)             ║
  5587.        ║                 Laufwerk, Pfad und Verzeichnisname den DOS-          ║
  5588.        ║                 Konventionen entsprechend. Der String muß mit einem  ║
  5589.        ║                 Nullcharacter abgeschlossen sein.                    ║
  5590.        ║INTEGER          Return: Fehlerflag.                                  ║
  5591.        ║                 0: Funktion erfolgreich abgeschlossen                ║
  5592.        ║                 1: Ein Fehler ist aufgetreten                        ║
  5593.        ╟──────────────────────────────────────────────────────────────────────╢
  5594.        ║Beispiel:        INTEGER FLAG                                         ║
  5595.        ║                 CALL DELVER ('D:\FORTRAN\LIB'//CHAR(0),FLAG)         ║
  5596.        ║                 Wenn in "FLAG" eine Null zurückgegeben wurde, ist das║
  5597.        ║                 Verzeichnis D:\FORTRAN\LIB gelöscht worden.          ║
  5598.        ╚══════════════════════════════════════════════════════════════════════╝
  5599.     
  5600.  
  5601.                                                                      Seite 139
  5602.  
  5603.  
  5604.        ╔══════════════════════════════════════════════════════════════════════╗
  5605.        ║Beschreibung der Subroutine DSUCH (PFAD,ATTR,ANZ,FELD)                ║
  5606.        ║Die Subroutine ermöglicht das Auffinden einer oder mehrerer Dateien   ║
  5607.        ║in einem Verzeichnis. Das Verzeichnis wird nach den auf das           ║
  5608.        ║Suchargument und auf das Dateiattribut zutreffenden Dateinamen        ║
  5609.        ║durchsucht. Die gefundenen Dateinamen werden ohne Laufwerksbezeichnung║
  5610.        ║und ohne Pfadnamen in einem Feld zurückgegeben. Das Suchargument muß  ║
  5611.        ║ein Dateiname sein, der eine Laufwerksbezeichnung und einen Pfadnamen ║
  5612.        ║beinhalten darf. Die Joker * und ? sind zugelassen. Die maximale      ║
  5613.        ║Anzahl der zu suchenden Dateien wird an die Routine übergeben, die    ║
  5614.        ║Anzahl der tatsächlich gefundenen Dateien wird an das rufende Programm║
  5615.        ║zurückgegeben. Wenn ein Hardware-Interrupt erfolgt, weil z. B. der    ║
  5616.        ║Diskettenschacht nicht geschlossen ist, wird in ANZ eine -1           ║
  5617.        ║zurückgegeben.                                                        ║
  5618.        ╟──────────────────────────────────────────────────────────────────────╢
  5619.        ║Parameter:                                                            ║
  5620.        ║CHARACTERSTRING  [PFAD]//DATEINAME//CHAR(0)                           ║
  5621.        ║                 Dateiname als Suchargument. Der Dateiname muß mit dem║
  5622.        ║                 Nullcharacter abgeschlossen werden und darf einen    ║
  5623.        ║                 Pfadnamen sowie die Joker * und ? beinhalten.        ║
  5624.        ║INTEGER          Dateiattribut als zweites Suchargument.              ║
  5625.        ║                  1   Read-only Datei                                 ║
  5626.        ║                  2   Hidden Datei                                    ║
  5627.        ║                  4   System Datei                                    ║
  5628.        ║                  8   Volume-ID (nur in der Root)                     ║
  5629.        ║                 16   Subdirectory                                    ║
  5630.        ║                 32   Archiv Datei                                    ║
  5631.        ║                 64   Normale Datei                                   ║
  5632.        ║                      (Read-only, Archiv, Hidden oder ohne Attribute) ║
  5633.        ║                 Die Attribute können durch Addition miteinander "OR"-║
  5634.        ║                 verknüpft werden. Die Suche nach Subdirectorys und   ║
  5635.        ║                 Volume-ID's schließt die restlichen Attribute aus.   ║
  5636.        ║INTEGER          Anzahl der maximal zu suchenden Dateien.             ║
  5637.        ║                 Return: Anzahl der tatsächlich gefundenen Dateien.   ║
  5638.        ║                         oder: -1 wenn ein Hardwareinterupt erfolgt   ║
  5639.        ║                         ist, weil z. B. keine Diskette im Disketten- ║
  5640.        ║                         laufwerk vorhanden ist.                      ║
  5641.        ║CHARACTERFELD    DATEINAME//BLANKS        [ 12 Characters * Anzahl! ] ║
  5642.        ║                 Return: Feld mit den Namen der gefundenen Dateien.   ║
  5643.        ╟──────────────────────────────────────────────────────────────────────╢
  5644.        ║Beispiel:        CHARACTER FELD(10)*12                                ║
  5645.        ║                 IANZ=10                                              ║
  5646.        ║                 CALL DSUCH ('C:/*.SYS'//CHAR(0),6,IANZ,FELD)         ║
  5647.        ║                 WRITE (*,'(10(1X,A,/))') (FELD(I),I=1,IANZ)          ║
  5648.        ║                 Bis zu 10 Hidden- oder System-Dateien mit dem        ║
  5649.        ║                 Dateierweiteungsnamen "SYS" werden in der Root des   ║
  5650.        ║                 Laufwerks C: gefunden und am Bildschirm dargestellt. ║
  5651.        ╚══════════════════════════════════════════════════════════════════════╝
  5652.     
  5653.  
  5654.                                                                      Seite 140
  5655.  
  5656.  
  5657.        ╔══════════════════════════════════════════════════════════════════════╗
  5658.        ║Beschreibung der Subroutine LFIND (ATTR,LW,FNAME,ANZ,FELD)            ║
  5659.        ║Die Subroutine ermöglicht das Auffinden einer oder mehrerer Dateien   ║
  5660.        ║in einem Laufwerk. Das in "LW" übergebene Laufwerk wird nach dem in   ║
  5661.        ║"FNAME" spezifizierten Dateinamen und nach dem in "ATTR" übergebenen  ║
  5662.        ║Dateiattribut nach den auf beide Bedingungen zutreffenden Dateien     ║
  5663.        ║durchsucht. Die gefundenen Dateinamen werden mit ihrem absoluten      ║
  5664.        ║Pfadnamen in einem Feld zurückgegeben. Das Suchargument muß ein       ║
  5665.        ║Dateiname ohne Laufwerksbezeichnung und Pfadnamen sein. Die Joker     ║
  5666.        ║* und ? sind zugelassen. Die maximale Anzahl der zu suchenden Dateien ║
  5667.        ║wird an die Routine übergeben, die Anzahl der tatsächlich gefundenen  ║
  5668.        ║Dateien wird an das rufende Programm zurückgegeben. Wenn ein          ║
  5669.        ║Hardware-Interrupt erfolgt, weil z. B. der Diskettenschacht nicht     ║
  5670.        ║geschlossen ist, wird in ANZ eine -1 zurückgegeben.                   ║
  5671.        ╟──────────────────────────────────────────────────────────────────────╢
  5672.        ║Parameter:                                                            ║
  5673.        ║INTEGER          Dateiattribut als Suchargument                       ║
  5674.        ║                  1   Read-only Datei                                 ║
  5675.        ║                  2   Hidden Datei                                    ║
  5676.        ║                  4   System Datei                                    ║
  5677.        ║                  8   Volume-ID (nur in der Root)                     ║
  5678.        ║                 16   Subdirectory                                    ║
  5679.        ║                 32   Archiv Datei                                    ║
  5680.        ║                 64   Normale Datei                                   ║
  5681.        ║                      (Read-only, Archiv, Hidden oder ohne Attribute) ║
  5682.        ║                 Die Attribute können durch Addition miteinander "OR"-║
  5683.        ║                 verknüpft werden. Die Suche nach Subdirectorys und   ║
  5684.        ║                 Volume-ID's schließt die restlichen Attribute aus.   ║
  5685.        ║CHARACTER        Laufwerkskennbuchstabe    [ 1 Character! ]           ║
  5686.        ║CHARACTERSTRING  DATEINAME//CHAR(0)        [ max. 13 Characters! ]    ║
  5687.        ║                 Dateiname als Suchargument. Der Dateiname muß mit dem║
  5688.        ║                 Nullcharacter abgeschlossen werden und darf maximal  ║
  5689.        ║                 13 Zeichen enthalten.                                ║
  5690.        ║INTEGER          Anzahl der maximal zu suchenden Dateien.             ║
  5691.        ║                 Return: Anzahl der tatsächlich gefundenen Dateien.   ║
  5692.        ║                         oder: -1 wenn ein Hardwareinterupt erfolgt   ║
  5693.        ║                         ist, weil z. B. keine Diskette im Disketten- ║
  5694.        ║                         laufwerk vorhanden ist.                      ║
  5695.        ║CHARACTERFELD    PFAD//DATEINAME//BLANKS   [ 50 Characters * Anzahl! ]║
  5696.        ║                 Return: Feld mit Pfad und Namen der gefundenen       ║
  5697.        ║                 Dateien.                                             ║
  5698.        ╟──────────────────────────────────────────────────────────────────────╢
  5699.        ║Beispiel:        CHARACTER FELD(10)*50                                ║
  5700.        ║                 IANZ=10                                              ║
  5701.        ║                 CALL LFIND (16,'D','*.*',IANZ,FELD)                  ║
  5702.        ║                 WRITE (*,'(10(1X,A,/))') (FELD(I),I=1,IANZ)          ║
  5703.        ║                 Bis zu 10 Subdirectories werden im Laufwerk D:       ║
  5704.        ║                 aufgefunden und am Bildschirm mit dem kompletten     ║
  5705.        ║                 Pfadnamen dargestellt.                               ║
  5706.        ╚══════════════════════════════════════════════════════════════════════╝
  5707.     
  5708.  
  5709.                                                                      Seite 141
  5710.  
  5711.  
  5712.        ╔══════════════════════════════════════════════════════════════════════╗
  5713.        ║Beschreibung der Subroutine DFIND (NAME,ANZ,FELD)                     ║
  5714.        ║Die Subroutine ermöglicht das Auffinden einer oder mehrerer Dateien   ║
  5715.        ║in allen Laufwerken. Zuerst wird das aktuelle Laufwerk (auch          ║
  5716.        ║Diskettenlaufwerk oder Server) nach den auf das Suchargument          ║
  5717.        ║zutreffenden Dateinamen durchsucht. Anschließend werden alle anderen  ║
  5718.        ║Laufwerke und Partitionen außer Diskettenlaufwerke und Server         ║
  5719.        ║durchsucht. Die gefundenen Dateinamen werden mit ihrem absoluten      ║
  5720.        ║Pfadnamen in einem Feld zurückgegeben. Das Suchargument muß ein       ║
  5721.        ║Dateiname ohne Laufwerksbezeichnung und Pfadnamen sein. Die Joker     ║
  5722.        ║* und ? sind zugelassen. Die maximale Anzahl der zu suchenden Dateien ║
  5723.        ║wird an die Routine übergeben, die Anzahl der tatsächlich gefundenen  ║
  5724.        ║Dateien wird an das rufende Programm zurückgegeben.                   ║
  5725.        ╟──────────────────────────────────────────────────────────────────────╢
  5726.        ║Parameter:                                                            ║
  5727.        ║CHARACTERSTRING  DATEINAME//CHAR(0)        [ max. 13 Characters! ]    ║
  5728.        ║                 Dateiname als Suchargument. Der Dateiname muß mit dem║
  5729.        ║                 Nullcharacter abgeschlossen werden und darf maximal  ║
  5730.        ║                 13 Zeichen enthalten.                                ║
  5731.        ║INTEGER          Anzahl der maximal zu suchenden Dateien.             ║
  5732.        ║                 Return: Anzahl der tatsächlich gefundenen Dateien.   ║
  5733.        ║CHARACTERFELD    PFAD//DATEINAME//BLANKS   [ 50 Characters * Anzahl! ]║
  5734.        ║                 Return: Feld mit Pfad und Namen der gefundenen       ║
  5735.        ║                 Dateien.                                             ║
  5736.        ╟──────────────────────────────────────────────────────────────────────╢
  5737.        ║Beispiel:        CHARACTER FELD(10)*50                                ║
  5738.        ║                 IANZ=10                                              ║
  5739.        ║                 CALL DFIND ('*.SYS',IANZ,FELD)                       ║
  5740.        ║                 WRITE (*,'(10(1X,A,/))') (FELD(I),I=1,IANZ)          ║
  5741.        ║                 Bis zu 10 Dateien mit dem Dateierweiteungsnamen "SYS"║
  5742.        ║                 werden aufgefunden und am Bildschirm mit ihrem       ║
  5743.        ║                 Pfadnamen dargestellt.                               ║
  5744.        ╚══════════════════════════════════════════════════════════════════════╝
  5745.     
  5746.  
  5747.                                                                      Seite 142
  5748.  
  5749.  
  5750.        ╔══════════════════════════════════════════════════════════════════════╗
  5751.        ║Beschreibung der Subroutine DINFO (PFAD,NAME,ATTR,DATUM,ZEIT,GROES)   ║
  5752.        ║Die Subroutine übergibt Informationen über eine anhand eines          ║
  5753.        ║Suchargumentes aufgefundene Datei an das rufende Programm. Das Such-  ║
  5754.        ║argument muß ein Dateiname sein, der eine Laufwerksbezeichnung und    ║
  5755.        ║einen Pfadnamen tragen darf. Die Joker * und ? sind zugelassen, ihre  ║
  5756.        ║Verwendung ist aber nicht sinnvoll. Wenn die im Suchargument          ║
  5757.        ║spezifizierte Datei gefunden wurde, werden der Dateiname, das Datei-  ║
  5758.        ║attribut, das Datum und die Uhrzeit der letzten Änderung in der Datei ║
  5759.        ║und die Dateigröße in Bytes zurückgegeben, andernfalls werden die     ║
  5760.        ║Parameter mit Blanks bzw. Nullen gefüllt.                             ║
  5761.        ╟──────────────────────────────────────────────────────────────────────╢
  5762.        ║Parameter:                                                            ║
  5763.        ║CHARACTERSTRING  [PFAD]//DATEINAME//CHAR(0)                           ║
  5764.        ║                 Dateiname als Suchargument. Der Dateiname muß mit dem║
  5765.        ║                 Nullcharacter abgeschlossen werden.                  ║
  5766.        ║CHARACTERSTRING  [ 12 Characters! ]                                   ║
  5767.        ║                 Return: Name der Datei.                              ║
  5768.        ║CHARACTERSTRING  [ 6 Characters! ]                                    ║
  5769.        ║                 Return: Attribute der Datei. (z. B.: "A----R")       ║
  5770.        ║                 "A" = Archiv-Datei                                   ║
  5771.        ║                 "D" = Directory                                      ║
  5772.        ║                 "V" = Volume Label                                   ║
  5773.        ║                 "S" = System-Datei                                   ║
  5774.        ║                 "H" = Hidden-Datei                                   ║
  5775.        ║                 "R" = Read-only-Datei                                ║
  5776.        ║                 "-" = Attribut nicht gesetzt                         ║
  5777.        ║INTEGER          Return: Datum der letzten Änderung in der Datei in   ║
  5778.        ║                 der Form :"JJJJMMTT".                                ║
  5779.        ║INTEGER          Return: Uhrzeit der letzten Änderung in der Datei in ║
  5780.        ║                 der Form: "HHMMSS".                                  ║
  5781.        ║INTEGER          Return: Größe der Datei in Bytes.                    ║
  5782.        ╟──────────────────────────────────────────────────────────────────────╢
  5783.        ║Beispiel:        CHARACTER NA*12,AT*6                                 ║
  5784.        ║                 CALL DINFO ('C:\FO\INFO.ASM'//CHAR(0),NA,AT,ID,IZ,IG)║
  5785.        ║                 IF (ID .NE. 0)                                       ║
  5786.        ║           -     WRITE (*,'(1X,A,1X,A,I9,I7,I8)') NA,AT,ID,IZ,IG      ║
  5787.        ║                 Wenn die Datei "INFO.ASM" im Verzeichnis "FO" des    ║
  5788.        ║                 Laufwerk "C" gefunden wird, werden die Datei-        ║
  5789.        ║                 informationen auf den Bildschirm geschrieben.        ║
  5790.        ╚══════════════════════════════════════════════════════════════════════╝
  5791.     
  5792.  
  5793.                                                                      Seite 143
  5794.  
  5795.  
  5796.        ╔══════════════════════════════════════════════════════════════════════╗
  5797.        ║Beschreibung der Subroutine DATEI (QUELLE,QATTR,ZIEL,FLAG)            ║
  5798.        ║Die Subroutine ermöglicht das Manipulieren mit Dateien. In <QUELLE>   ║
  5799.        ║steht der Name der Quelldatei, die manipuliert werden soll. In <QATTR>║
  5800.        ║werden Dateiattribute angegeben, nach denen die Quelldatei            ║
  5801.        ║vorselektiert wird. Wenn die Quelldatei andere als die angegebenen    ║
  5802.        ║Attribute aufweist, wird die Subroutine abgebrochen. In <ZIEL> steht  ║
  5803.        ║der Name der Ergebnisdatei für die durchzuführende Manipulation.      ║
  5804.        ║<FLAG> enthält eine Kennung für die Art der auszuführenden            ║
  5805.        ║Dateimanipulation. Der Rückgabewert ist ein Fehlercode, der beim      ║
  5806.        ║ordnungsgemäßen Abschluß der Subroutine Null ist, sonst eine positive ║
  5807.        ║Zahl enthält. Wenn ein Hardware-Interrupt erfolgt, weil z. B. der     ║
  5808.        ║Diskettenschacht nicht geschlossen ist, wird in <FLAG> eine -1        ║
  5809.        ║zurückgegeben. Dateimanipulationen, die sich nur auf die Quelldatei   ║
  5810.        ║beziehen, benötigen für <ZIEL> nur ein Null-Character. In <QATTR>     ║
  5811.        ║wird das Dateiattribut der Quelldatei zurückgegeben.                  ║
  5812.        ╟──────────────────────────────────────────────────────────────────────╢
  5813.        ║Parameter:                                                            ║
  5814.        ║CHARACTERSTRING  [LAUFWERK]//[PFAD]//DATEINAME//CHAR(0)               ║
  5815.        ║                 Quelldatei deren Inhalt manipuliert werden soll. Der ║
  5816.        ║                 String muß mit einem Nullcharacter abgeschlossen     ║
  5817.        ║                 sein. Die Joker * und ? dürfen nicht enthalten sein. ║
  5818.        ║INTEGER          Dateiattribut zum Ausselektieren der Quelldatei oder ║
  5819.        ║                 zum Setzen oder Zurücksetzen von Dateiattributen.    ║
  5820.        ║                  1   Read-only Datei                                 ║
  5821.        ║                  2   Hidden Datei                                    ║
  5822.        ║                  4   System Datei                                    ║
  5823.        ║                  8   Volume-ID (nur in der Root)                     ║
  5824.        ║                 16   Subdirectory                                    ║
  5825.        ║                 32   Archiv Datei                                    ║
  5826.        ║                 64   Normale Datei                                   ║
  5827.        ║                      (Read-only, Archiv, Hidden oder ohne Attribute) ║
  5828.        ║                 Die Attribute können durch Addition miteinander "OR"-║
  5829.        ║                 verknüpft werden.                                    ║
  5830.        ║                 Return: Tatsächliches Attribut der Quelldatei        ║
  5831.        ║                  1   Read-only Datei                                 ║
  5832.        ║                  2   Hidden Datei                                    ║
  5833.        ║                  4   System Datei                                    ║
  5834.        ║                  8   Volume-ID (nur in der Root)                     ║
  5835.        ║                 16   Subdirectory                                    ║
  5836.        ║                 32   Archiv Datei                                    ║
  5837.        ║                 Die Attribute sind miteinander "OR"-verknüpft.       ║
  5838.        ║CHARACTERSTRING  [LAUFWERK]//[PFAD]//DATEINAME//CHAR(0)               ║
  5839.        ║                 Zieldatei für die durchzuführende Manipulation. Der  ║
  5840.        ║                 String muß mit einem Nullcharacter abgeschlossen     ║
  5841.        ║                 sein. Die Joker * und ? dürfen nicht enthalten sein. ║
  5842.        ║INTEGER          Art der Dateimanipulation                            ║
  5843.        ║                  0   Quelldatei kopieren, Zieldatei nicht            ║
  5844.        ║                      überschreiben                                   ║
  5845.        ║                  1   Quelldatei kopieren, Zieldatei überschreiben    ║
  5846.        ║                  2   Quelldatei kopieren, Zieldatei nicht            ║
  5847.        ║                      überschreiben, Quelldatei löschen               ║
  5848.        ║                  3   Quelldatei kopieren, Zieldatei überschreiben,   ║
  5849.        ║                      Quelldatei löschen                              ║
  5850.        ║                  4   Quelldatei verschlüsseln                        ║
  5851.     
  5852.  
  5853.                                                                      Seite 144
  5854.  
  5855.  
  5856.        ║                  5   Quelldatei entschlüsseln                        ║
  5857.        ║                  6   Quelldatei-Attribute setzen                     ║
  5858.        ║                  7   Quelldatei-Attribute zurücksetzen               ║
  5859.        ║                  8   Quelldatei logisch löschen (auch leeres         ║
  5860.        ║                      Verzeichnis)                                    ║
  5861.        ║                  9   Quelldatei physikalisch löschen (auch leeres    ║
  5862.        ║                      Verzeichnis)                                    ║
  5863.        ║                 Return: Fehlerflag                                   ║
  5864.        ║                 -1   Hardwarefehler aufgetreten                      ║
  5865.        ║                  0   Dateifunktion fehlerfrei beendet                ║
  5866.        ║                  1   Nicht näher erläuterter Fehler                  ║
  5867.        ║                  2   Attribute der Quelldatei passen nicht           ║
  5868.        ║                  3   Zieldatei vorhanden                             ║
  5869.        ║                  4   Zieldatei ist schreibgeschützt                  ║
  5870.        ║                  5   Quelldatei ist schreibgeschützt                 ║
  5871.        ║                  6   Quelldatei erhalten, da schreibgeschützt        ║
  5872.        ║                  7   Quelldatei nicht vorhanden                      ║
  5873.        ║                  8   Zieldatei konnte nicht angelegt werden          ║
  5874.        ║                  9   Attributänderung mißlungen                      ║
  5875.        ║                 10   Quelldatei ist bereits codiert                  ║
  5876.        ║                 11   Quelldatei ist bereits decodiert                ║
  5877.        ║                 12   Kein Speicherplatz auf Disk verfügbar           ║
  5878.        ║                 13   Verzeichnis ist nicht leer                      ║
  5879.        ║                 14   Nicht genügend Arbeitsspeicher vorhanden        ║
  5880.        ║                 15   Quell- und Zieldatei sind identisch             ║
  5881.        ║                 16   Fehlerhafte Parameter übergeben                 ║
  5882.        ║                 17   Aktuelles Verzeichnis ist nicht löschbar        ║
  5883.        ║                 18   Löschvorgang mißlungen                          ║
  5884.        ╟──────────────────────────────────────────────────────────────────────╢
  5885.        ║Beispiel:        CHARACTER QUELL*30,ZIEL*30                           ║
  5886.        ║                 IFL=6                                                ║
  5887.        ║                 QUELL='A:\'                                          ║
  5888.        ║                 CALL DATEI (QUELL,0,CHAR(0),IFL)                     ║
  5889.        ║                 IF (IFL .EQ. -1) WRITE .............                 ║
  5890.        ║                 IFL=1                                                ║
  5891.        ║                 QUELL='D:\UTIL\DATEIA.TXT'//CHAR(0)                  ║
  5892.        ║                 ZIEL ='A:\TEXTE\DATEIB.TXT'//CHAR(0)                 ║
  5893.        ║                 CALL DATEI (QUELL,64,ZIEL,IFL)                       ║
  5894.        ║                 IF (IFL .NE. 0) WRITE .............                  ║
  5895.        ║                 IFL=4                                                ║
  5896.        ║                 QUELL='D:\UTIL\DATEIA.TXT'//CHAR(0)                  ║
  5897.        ║                 CALL DATEI (QUELL,64,CHAR(0),IFL)                    ║
  5898.        ║                 IF (IFL .NE. 0) WRITE .............                  ║
  5899.        ║                 Im ersten Beispiel wird lediglich kontrolliert, ob   ║
  5900.        ║                 der Diskettenschacht im Laufwerk A: geschlossen ist. ║
  5901.        ║                 Das zweite Beispiel kopiert eine Datei und im dritten║
  5902.        ║                 Beispiel wird eine Datei verschlüsselt.              ║
  5903.        ╚══════════════════════════════════════════════════════════════════════╝
  5904.     
  5905.  
  5906.                                                                      Seite 145
  5907.  
  5908.  
  5909.        Zugriff auf Speicherinhalte
  5910.  
  5911.        Subroutinen aus FORSUB.LIB erlauben es, beliebige Speicheradressen
  5912.        auszulesen, zu beschreiben oder deren Inhalte umzuspeichern.  Dadurch
  5913.        ist es beispielsweise möglich, Daten direkt in den Bildschirmspeicher zu
  5914.        schreiben oder daraus zu lesen.  Auch können bestimmte Statusadressen
  5915.        des Personal-Computers ausgelesen oder beschrieben werden.  Allokierte
  5916.        Speicherbereiche und Variableninhalte lassen sich extrem schnell
  5917.        umkopieren.
  5918.  
  5919.  
  5920.        Subroutinen für den Zugriff auf Speicherinhalte
  5921.  
  5922.        PEEK    a) Speicherinhalt ab Segment/Offset-Adresse in eine Variable
  5923.                   schreiben
  5924.        POKE    a) Variableninhalt an eine Segment/Offset-Adresse in den
  5925.                   Speicher schreiben
  5926.        PEPO    a) Speicherinhalt ab Segment/Offset-Adresse mit vorgegebener
  5927.                   Länge an eine andere Speicheradresse schreiben.
  5928.        PEEKS   a) Jedes zweite Byte eines Speicherinhalts ab Segment/Offset-
  5929.                   Adresse in eine Variable schreiben (Bildschirmspeicher!)
  5930.        POKES   a) Variableninhalt an eine Segment/Offset-Adresse in den
  5931.                   Speicher schreiben, dabei nur jedes zweite Byte beschreiben
  5932.                   (Bildschirmspeicher!)
  5933.     
  5934.  
  5935.                                                                      Seite 146
  5936.  
  5937.  
  5938.        ╔══════════════════════════════════════════════════════════════════════╗
  5939.        ║Beschreibung der Subroutine PEEK (SEGMENT,OFFSET,STRING,ANZ)          ║
  5940.        ║Die Subroutine liest ANZ Byte aus dem RAM-Speicher ab der Adresse     ║
  5941.        ║SEGMENT:OFFSET in eine Variable STRING.                               ║
  5942.        ╟──────────────────────────────────────────────────────────────────────╢
  5943.        ║Parameter:                                                            ║
  5944.        ║INTEGER          Segment der Adresse im RAM-Speicher.                 ║
  5945.        ║INTEGER          Offset der Adresse im RAM-Speicher.                  ║
  5946.        ║INTEGER          Return: Aus dem RAM-Speicher gelesener Wert          ║
  5947.        ║                 (ANZ muß dazu der Länge der Integervariablen         ║
  5948.        ║                 entsprechen: 1, 2 oder 4).                           ║
  5949.        ║oder:                                                                 ║
  5950.        ║CHARACTERSTRING  Return: Aus dem RAM-Speicher gelesener String        ║
  5951.        ║                 (ANZ muß dazu der Länge des zu lesenden Strings      ║
  5952.        ║                 entsprechen).                                        ║
  5953.        ║INTEGER          Anzahl der in STRING einzulesenden Byte.             ║
  5954.        ╟──────────────────────────────────────────────────────────────────────╢
  5955.        ║Beispiele:       CALL PEEK (1,10,I,4)                                 ║
  5956.        ║                 Vier Byte ab der RAM-Adresse Segment 1, Offset 10    ║
  5957.        ║                 werden in eine Integervariable I gelesen.            ║
  5958.        ║                 CHARACTER STRING*20                                  ║
  5959.        ║                 CALL PEEK (1,10,STRING,20)                           ║
  5960.        ║                 Zwanzig Byte ab der RAM-Adresse Segment 1, Offset 10 ║
  5961.        ║                 werden in einen Characterstring STRING gelesen.      ║
  5962.        ╚══════════════════════════════════════════════════════════════════════╝
  5963.     
  5964.  
  5965.                                                                      Seite 147
  5966.  
  5967.  
  5968.        ╔══════════════════════════════════════════════════════════════════════╗
  5969.        ║Beschreibung der Subroutine POKE (SEGMENT,OFFSET,STRING,ANZ)          ║
  5970.        ║Die Subroutine schreibt ANZ Byte aus der Variablen STRING in den      ║
  5971.        ║RAM-Speicher ab Adresse SEGMENT:OFFSET.                               ║
  5972.        ╟──────────────────────────────────────────────────────────────────────╢
  5973.        ║Parameter:                                                            ║
  5974.        ║INTEGER          Segment der Adresse im RAM-Speicher.                 ║
  5975.        ║INTEGER          Offset der Adresse im RAM-Speicher.                  ║
  5976.        ║INTEGER          In den RAM-Speicher zu schreibender Wert             ║
  5977.        ║                 (ANZ muß dazu der Länge der Integervariablen         ║
  5978.        ║                 entsprechen: 1, 2 oder 4).                           ║
  5979.        ║oder:                                                                 ║
  5980.        ║CHARACTERSTRING  In den RAM-Speicher zu schreibender String           ║
  5981.        ║                 (ANZ muß dazu der Länge des zu schreibenden Strings  ║
  5982.        ║                 entsprechen).                                        ║
  5983.        ║INTEGER          Anzahl der aus STRING in den RAM-Speicher zu         ║
  5984.        ║                 schreibenden Byte.                                   ║
  5985.        ╟──────────────────────────────────────────────────────────────────────╢
  5986.        ║Beispiele:       CALL POKE (1,10,I,4)                                 ║
  5987.        ║                 Es werden vier Byte ab der RAM-Adresse Segment 1,    ║
  5988.        ║                 Offset 10 aus der Integervariablen I in den          ║
  5989.        ║                 RAM-Speicher geschrieben.                            ║
  5990.        ║                 CHARACTER STRING*20                                  ║
  5991.        ║                 CALL POKE (1,10,STRING,20)                           ║
  5992.        ║                 Es werden zwanzig Byte ab der RAM-Adresse Segment 1, ║
  5993.        ║                 Offset 10 aus dem Characterstring STRING in den      ║
  5994.        ║                 RAM-Speicher geschrieben.                            ║
  5995.        ╚══════════════════════════════════════════════════════════════════════╝
  5996.     
  5997.  
  5998.                                                                      Seite 148
  5999.  
  6000.  
  6001.        ╔══════════════════════════════════════════════════════════════════════╗
  6002.        ║Beschreibung der Subroutine PEPO (LESSEG,LESOFF,SCHSEG,SCHOFF,ANZ)    ║
  6003.        ║Die Subroutine liest ANZ Byte aus dem RAM-Speicher ab der Adresse     ║
  6004.        ║LESSEG:LESOFF und schreibt sie an anderer Stelle ab der Adresse       ║
  6005.        ║SCHSEG:SCHOFF zurück.                                                 ║
  6006.        ╟──────────────────────────────────────────────────────────────────────╢
  6007.        ║Parameter:                                                            ║
  6008.        ║INTEGER          Segment des zu lesenden Speicherinhalts.             ║
  6009.        ║INTEGER          Offset des zu lesenden Speicherinhalts.              ║
  6010.        ║INTEGER          Segment der zu beschreibenden Speicheradresse.       ║
  6011.        ║INTEGER          Offset der zu beschreibenden Speicheradresse.        ║
  6012.        ║INTEGER          Anzahl der in STRING einzulesenden Byte.             ║
  6013.        ╟──────────────────────────────────────────────────────────────────────╢
  6014.        ║Beispiele:       CALL PEPO (1,10,100,10,1000)                         ║
  6015.        ║                 1000 Byte ab der RAM-Adresse Segment 1, Offset 10    ║
  6016.        ║                 werden in eine an die Adresse Segment 100, Offset 10 ║
  6017.        ║                 geschrieben.                                         ║
  6018.        ╚══════════════════════════════════════════════════════════════════════╝
  6019.     
  6020.  
  6021.                                                                      Seite 149
  6022.  
  6023.  
  6024.        ╔══════════════════════════════════════════════════════════════════════╗
  6025.        ║Beschreibung der Subroutine PEEKS (SEGMENT,OFFSET,STRING,ANZ)         ║
  6026.        ║Die Subroutine liest ANZ Bytes aus dem Bildschirmspeicher ab der      ║
  6027.        ║Adresse SEGMENT:OFFSET in eine Variable STRING. Dabei wird jedoch nur ║
  6028.        ║jedes zweite Byte aus dem Bildschirmspeicher gelesen. Es ist also     ║
  6029.        ║möglich nur Textzeichen oder nur Farbattribute zu lesen.              ║
  6030.        ╟──────────────────────────────────────────────────────────────────────╢
  6031.        ║Parameter:                                                            ║
  6032.        ║INTEGER          Segment des Bildschirmspeichers:                     ║
  6033.        ║                 #0B000: Segment des Monochromebildschirmspeichers    ║
  6034.        ║                 #0B800: Segment des Farbbildschirmspeichers          ║
  6035.        ║INTEGER          Offset im Bildschirmspeicher.                        ║
  6036.        ║CHARACTERSTRING  Return: Aus dem Bildschirmspeicher gelesener Text    ║
  6037.        ║                 oder Farbattribute.                                  ║
  6038.        ║INTEGER          Anzahl der in STRING einzulesenden Byte.             ║
  6039.        ╟──────────────────────────────────────────────────────────────────────╢
  6040.        ║Beispiele:       CHARACTER STRING*40                                  ║
  6041.        ║                 CALL PEEKS (#0B800,0,STRING,40)                      ║
  6042.        ║                 Vierzig Farbattribute werden aus dem Farbbildschirm- ║
  6043.        ║                 speicher ausgelesen und in der Variablen STRING      ║
  6044.        ║                 abgelegt.                                            ║
  6045.        ║                 CHARACTER STRING*40                                  ║
  6046.        ║                 CALL PEEKS (#0B000,1,STRING,40)                      ║
  6047.        ║                 Vierzig Textzeichen werden aus dem Monochrome-       ║
  6048.        ║                 bildschirmspeicher ausgelesen und in der Variablen   ║
  6049.        ║                 STRING abgelegt.                                     ║
  6050.        ╚══════════════════════════════════════════════════════════════════════╝
  6051.     
  6052.  
  6053.                                                                      Seite 150
  6054.  
  6055.  
  6056.        ╔══════════════════════════════════════════════════════════════════════╗
  6057.        ║Beschreibung der Subroutine POKES (SEGMENT,OFFSET,STRING,ANZ)         ║
  6058.        ║Die Subroutine schreibt ANZ Bytes aus der Variablen STRING in den     ║
  6059.        ║Bildschirmspeicher ab der Adresse SEGMENT:OFFSET. Dabei wird jedoch   ║
  6060.        ║nur jedes zweite Offset des Bildschirmspeichers beschrieben. Es ist   ║
  6061.        ║dadurch möglich nur Textzeichen oder nur Farbattribute zu schreiben.  ║
  6062.        ╟──────────────────────────────────────────────────────────────────────╢
  6063.        ║Parameter:                                                            ║
  6064.        ║INTEGER          Segment des Bildschirmspeichers:                     ║
  6065.        ║                 #0B000: Segment des Monochromebildschirmspeichers    ║
  6066.        ║                 #0B800: Segment des Farbbildschirmspeichers          ║
  6067.        ║INTEGER          Offset im Bildschirmspeicher.                        ║
  6068.        ║CHARACTERSTRING  In den Bildschirmspeicher zu schreibender Text oder  ║
  6069.        ║                 Farbattribute.                                       ║
  6070.        ║INTEGER          Anzahl der in den Bildschirmspeicher zu schreibenden ║
  6071.        ║                 Bytes.                                               ║
  6072.        ╟──────────────────────────────────────────────────────────────────────╢
  6073.        ║Beispiele:       CHARACTER STRING*40                                  ║
  6074.        ║                 CALL POKES (#0B800,0,STRING,40)                      ║
  6075.        ║                 Vierzig Farbattribute werden aus der Variablen STRING║
  6076.        ║                 in den Bildschirmspeicher geschrieben.               ║
  6077.        ║                 CHARACTER STRING*40                                  ║
  6078.        ║                 CALL POKES (#0B000,1,STRING,40)                      ║
  6079.        ║                 Vierzig Textzeichen werden aus der Variablen STRING  ║
  6080.        ║                 in den Bildschirmspeicher geschrieben.               ║
  6081.        ╚══════════════════════════════════════════════════════════════════════╝
  6082.     
  6083.  
  6084.                                                                      Seite 151
  6085.  
  6086.  
  6087.        Virtuelle Speicherverwaltung
  6088.  
  6089.        Im Gegensatz zu vielen anderen Hochsprachen bietet FORTRAN standardmäßig
  6090.        nicht die Möglichkeit der virtuellen Speicherverwaltung.  Subroutinen
  6091.        aus FORSUB.LIB ermöglichen jedoch die Allokation von Speicherblöcken zur
  6092.        Ablage von Datenmengen, das Rückgewinnen von Daten aus allokierten
  6093.        Speicherblöcken und das Verändern und Löschen allokierter
  6094.        Speicherbereiche.  Durch die virtuelle Speicherverwaltung können zum
  6095.        Beispiel lokale und globale Datenbereiche eingerichtet,
  6096.        Bildschirminhalte und Datenfelder vorübergehend zwischengespeichert und
  6097.        sehr schnelle Datenzugriffe realisiert werden.
  6098.  
  6099.        Vier Subroutinen können neben dem verfügbaren Arbeitspeicher den Inhalt
  6100.        einer Arbeitsdatei für sehr große zu verwaltende Datenmengen nutzen.
  6101.        Wenn im Arbeitsspeicher nicht mehr genügend Speicherplatz vorhanden ist,
  6102.        wird eine temporäre, direct organisierte Datei eröffnet.  Die dort
  6103.        abgelegten Daten stehen unabhängig von der Größe des noch freien
  6104.        Arbeitsspeichers zur Verfügung.  Das Programm erhält von den Subroutinen
  6105.        für jeden Datenblock im Arbeitsspeicher oder in der Arbeitsdatei eine
  6106.        Adresse zurück, mit deren Hilfe auf die dort abgelegten Daten
  6107.        zugegriffen werden kann.  Die Adresse ist positiv, wenn sie den
  6108.        Arbeitsspeicher betrifft und negativ, wenn sie die Arbeitsdatei
  6109.        betrifft.  Beim Zugriff auf einen abgelegten Datenblock erkennt die
  6110.        betreffende Subroutine daran automatisch, wo die Daten zu finden sind.
  6111.  
  6112.  
  6113.        Subroutinen zur virtuellen Speicherverwaltung
  6114.  
  6115.        ALMEM   a) Block im Arbeitsspeicher allokieren
  6116.        MOMEM   a) Die Größe eines im Arbeitsspeicher allokierten Blocks
  6117.                   ändern
  6118.        REMEM   a) Im Arbeitsspeicher allokierten Block wieder freigeben
  6119.        CREMEM  a) Block im Arbeitsspeicher oder in einer Arbeitsdatei
  6120.                   allokieren und Variableninhalt dort ablegen
  6121.        PUTMEM  a) Variableninhalt in den bereits allokierten Block im
  6122.                   Arbeitsspeicher oder in der Arbeitsdatei ablegen
  6123.        GETMEM  a) Inhalt aus dem allokierten Block des Arbeitsspeichers oder
  6124.                   der Arbeitsdatei in einer Variablen ablegen
  6125.        FREMEM  a) Allokierten Block im Arbeitsspeicher oder in der Arbeitsdate
  6126.                   wieder freigeben
  6127.     
  6128.  
  6129.                                                                      Seite 152
  6130.  
  6131.  
  6132.        ╔══════════════════════════════════════════════════════════════════════╗
  6133.        ║Beschreibung der Subroutine ALMEM (BYTES,SEG,FLAG)                    ║
  6134.        ║Die Subroutine allokiert einen "BYTES" großen Bereich in der Memory.  ║
  6135.        ║Bei Erfolgreicher Allokation wird in "SEG" die Nummer des Segmentes   ║
  6136.        ║übergeben, an dem der allokierte Speicherbereich beginnt. Das "FLAG"  ║
  6137.        ║ist in diesen Fall Null gesetzt, sonst eins.                          ║
  6138.        ╟──────────────────────────────────────────────────────────────────────╢
  6139.        ║Parameter:                                                            ║
  6140.        ║INTEGER          Größe des zu allokierenden Speicherblocks in Bytes.  ║
  6141.        ║INTEGER          Return: Segment in dem der allokierte Speicherblock  ║
  6142.        ║                 beginnt. Das Offset des allokierten Speicherblocks   ║
  6143.        ║                 ist Null.                                            ║
  6144.        ║INTEGER          Return: Fehlerflag                                   ║
  6145.        ║                 0: Speicherblock erfolgreich allokiert               ║
  6146.        ║                 1: Speicherblock konte nicht allokiert werden.       ║
  6147.        ╟──────────────────────────────────────────────────────────────────────╢
  6148.        ║Beispiel:        INTEGER SEG,FLAG                                     ║
  6149.        ║                 CALL ALMEM (1000,SEG,FLAG)                           ║
  6150.        ║                 Wenn in "FLAG" eine Null zurückgegeben wurde, steht  ║
  6151.        ║                 ab der Adresse SEG:0 ein Speicherblock von 1000 Bytes║
  6152.        ║                 zur Verfügung.                                       ║
  6153.        ╚══════════════════════════════════════════════════════════════════════╝
  6154.     
  6155.  
  6156.                                                                      Seite 153
  6157.  
  6158.  
  6159.        ╔══════════════════════════════════════════════════════════════════════╗
  6160.        ║Beschreibung der Subroutine MOMEM (BYTES,SEG,FLAG)                    ║
  6161.        ║Die Subroutine versucht die Größe eines schon allokierten Blocks in   ║
  6162.        ║der Memory zu ändern. In BYTES" wird die neue Blockgröße in Bytes und ║
  6163.        ║in "SEG" wird das Segment des schon allokierten Blocks angegeben.     ║
  6164.        ║Bei Erfolg wird in "FLAG" eine Null übergeben, sonst eine Eins.       ║
  6165.        ╟──────────────────────────────────────────────────────────────────────╢
  6166.        ║Parameter:                                                            ║
  6167.        ║INTEGER          Neue Größe für den schon allokierenden Speicherblock ║
  6168.        ║                 in Bytes.                                            ║
  6169.        ║INTEGER          Segment des schon allokierten Speicherblocks.        ║
  6170.        ║INTEGER          Return: Fehlerflag                                   ║
  6171.        ║                 0: Speicherblock erfolgreich geändert                ║
  6172.        ║                 1: Speicherblock konte nicht geändert werden.        ║
  6173.        ╟──────────────────────────────────────────────────────────────────────╢
  6174.        ║Beispiel:        INTEGER SEG,FLAG                                     ║
  6175.        ║                 CALL ALMEM (1000,SEG,FLAG)                           ║
  6176.        ║                 CALL MOMEM (500,SEG,FLAG)                            ║
  6177.        ║                 Wenn in "FLAG" eine Null zurückgegeben wurde, ist der║
  6178.        ║                 mit "ALMEM" allokierte Speicherblock von 1000 Bytes  ║
  6179.        ║                 erfolgreich auf 500 Bytes verkleinert worden.        ║
  6180.        ╚══════════════════════════════════════════════════════════════════════╝
  6181.     
  6182.  
  6183.                                                                      Seite 154
  6184.  
  6185.  
  6186.        ╔══════════════════════════════════════════════════════════════════════╗
  6187.        ║Beschreibung der Subroutine REMEM (SEG,FLAG)                          ║
  6188.        ║Die Subroutine gibt einen vorher allokierten Bereich in der Memory    ║
  6189.        ║ab der Adresse SEG:0 wieder frei. Wenn dabei ein Fehler auftritt, wird║
  6190.        ║"FLAG" eins gesetzt, sonst enthält es eine Null.                      ║
  6191.        ╟──────────────────────────────────────────────────────────────────────╢
  6192.        ║Parameter:                                                            ║
  6193.        ║INTEGER          Segment des vorher allokierten Speicherblocks.       ║
  6194.        ║                 beginnt. Das Offset des allokierten Speicherblocks   ║
  6195.        ║                 ist Null.                                            ║
  6196.        ║INTEGER          Return: Fehlerflag                                   ║
  6197.        ║                 0: Speicherblock erfolgreich allokiert               ║
  6198.        ║                 1: Speicherblock konte nicht allokiert werden.       ║
  6199.        ╟──────────────────────────────────────────────────────────────────────╢
  6200.        ║Beispiel:        INTEGER SEG,FLAG                                     ║
  6201.        ║                 CALL ALMEM (1000,SEG,FLAG)                           ║
  6202.        ║                 CALL REMEM (SEG,FLAG)                                ║
  6203.        ║                 Wenn in "FLAG" eine Null zurückgegeben wurde, ist der║
  6204.        ║                 vorher mit "ALMEM" allokierte 1000 byte große        ║
  6205.        ║                 Speicherblock wieder freigegeben.                    ║
  6206.        ╚══════════════════════════════════════════════════════════════════════╝
  6207.     
  6208.  
  6209.                                                                      Seite 155
  6210.  
  6211.  
  6212.        ╔═════════════════════════════════════════════════════════════════════╗
  6213.        ║Beschreibung der Subroutine CREMEM (ADD,LAN,SEG,FLAG)                ║
  6214.        ║Die Subroutine allokiert einen "LAN" Byte großen Bereich in der      ║
  6215.        ║Memory. Falls in der Memory kein Speicherplatz mehr zur Verfügung    ║
  6216.        ║steht, wird ein entsprechender Bereich in einer direkt organisierten ║
  6217.        ║temporären Datei zur Verfügung gestellt. Die an der Adresse "ADD"    ║
  6218.        ║gespeicherten Daten oder Datenfelder werden in den allokierten       ║
  6219.        ║Bereich umgespeichert. In "SEG" steht anschließend die Adresse des   ║
  6220.        ║allokierten Speicherbereiches. Sie ist positiv, wenn der Speicher-   ║
  6221.        ║bedarf in der Memory allokiert werden konnte (Segment) und sie ist   ║
  6222.        ║negativ, wenn der Speicherbedarf in der temporären Datei zur         ║
  6223.        ║Verfügung steht (Satznummer). Die in "SEG" übergebene Adresse wird   ║
  6224.        ║für zukünftige Operationen mit den Subroutinen "PUTMEM", "GETMEM" und║
  6225.        ║"FREMEM" benötigt. Wenn diese Subroutine von einem Programm genutzt  ║
  6226.        ║wird, darf keine Datei mit dem Unit 100 eröffnet werden, da das Unit ║
  6227.        ║für die temporäre Datei benötigt wird. Bei erfolgreicher Beendigung  ║
  6228.        ║der Subroutine steht in "FLAG" eine Null, sonst eine Eins.           ║
  6229.        ╟─────────────────────────────────────────────────────────────────────╢
  6230.        ║Parameter:                                                           ║
  6231.        ║INTEGER          Adresse einer Variablen oder eines Variablenfeldes, ║
  6232.        ║                 das in der Memory abgelegt werden soll              ║
  6233.        ║                 [ LOC(Variable) ].                                  ║
  6234.        ║INTEGER          Größe der Variable oder des Variablenfeldes in Byte.║
  6235.        ║INTEGER          Return: Positiv: Memorysegment, an dem die Variable ║
  6236.        ║                         oder das Variablenfeld abgelegt ist.        ║
  6237.        ║                         Negativ: Satznummer in der direkt organis.  ║
  6238.        ║                         temporären Datei, ab der die Variable oder  ║
  6239.        ║                         das Variablenfeld abgelegt ist.             ║
  6240.        ║INTEGER          Return: Fehlerflag                                  ║
  6241.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  6242.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  6243.        ╟─────────────────────────────────────────────────────────────────────╢
  6244.        ║Subroutinen:     ADRESS,ALMEM,FREMEM,PEPO                            ║
  6245.        ╟─────────────────────────────────────────────────────────────────────╢
  6246.        ║Beispiel:        INTEGER FELD(100),FELD1(100),FELD2(100),SEG         ║
  6247.        ║                 DO 1 I=1,100                                        ║
  6248.        ║                    FELD(I)=1                                        ║
  6249.        ║                    FELD2(I)=0                                       ║
  6250.        ║               1 CONTINUE                                            ║
  6251.        ║                 CALL CREMEM (LOC(FELD),400,SEG,I)                   ║
  6252.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6253.        ║                 CALL GETMEM (LOC(FELD1),400,SEG,I)                  ║
  6254.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6255.        ║                 CALL PUTMEM (LOC(FELD2),400,SEG,I)                  ║
  6256.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6257.        ║                 CALL FREMEM (SEG,I)                                 ║
  6258.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6259.        ║                 RETURN                                              ║
  6260.        ║               2 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  6261.        ║                 Mit der Subroutine "CREMEM" werden 400 Byte in der  ║
  6262.        ║                 Memory bzw. in einem temporären File allokiert und  ║
  6263.        ║                 das Integerfeld "FELD" im allokierten Bereich       ║
  6264.        ║                 abgelegt. "GETMEM" liest den allokierten Bereich    ║
  6265.        ║                 in ein Integerfeld "FELD1". Die Subroutine "PUTMEM" ║
  6266.        ║                 überschreibt den allokierten Speicherbereich mit dem║
  6267.     
  6268.  
  6269.                                                                      Seite 156
  6270.  
  6271.  
  6272.        ║                 Integerfeld "FELD2". "FREMEM" gibt den allokierten  ║
  6273.        ║                 Speicherbereich wieder frei. Beim Auftreten eines   ║
  6274.        ║                 Fehlers wird eine Meldung ausgegeben.               ║
  6275.        ╚═════════════════════════════════════════════════════════════════════╝
  6276.     
  6277.  
  6278.                                                                      Seite 157
  6279.  
  6280.  
  6281.        ╔═════════════════════════════════════════════════════════════════════╗
  6282.        ║Beschreibung der Subroutine PUTMEM (ADD,LAN,SEG,FLAG)                ║
  6283.        ║Die Subroutine legt eine Variable oder ein Variablenfeld, dessen     ║
  6284.        ║Adresse in "ADD" übergeben wird, in bereits allokierter Memory ab.   ║
  6285.        ║Dazu muß in "SEG" die Adresse des allokierten Speicherbereichs       ║
  6286.        ║stehen. Sie ist positiv, wenn der Speicherbedarf in der Memory       ║
  6287.        ║allokiert ist (Segment) und sie ist negativ, wenn der Speicherbedarf ║
  6288.        ║in einer temporären Datei zur Verfügung steht (Satznummer). In       ║
  6289.        ║"LAN" steht die Länge der Variable oder des Variablenfeldes. Bei     ║
  6290.        ║erfolgreicher Beendigung der Subroutine wird in "FLAG" eine Null,    ║
  6291.        ║sonst eine Eins an das rufende Programm zurückgegeben.               ║
  6292.        ╟─────────────────────────────────────────────────────────────────────╢
  6293.        ║Parameter:                                                           ║
  6294.        ║INTEGER          Adresse einer Variablen oder eines Variablenfeldes, ║
  6295.        ║                 das in der Memory abgelegt werden soll              ║
  6296.        ║                 [ LOC(Variable) ].                                  ║
  6297.        ║INTEGER          Größe der Variable oder des Variablenfeldes in Byte.║
  6298.        ║INTEGER          Positiv: Segmentadresse der Memory, an der die      ║
  6299.        ║                 Variable oder das Variablenfeld abgelegt werden     ║
  6300.        ║                 soll.                                               ║
  6301.        ║                 Negativ: Satznummer in der direkt organisierten     ║
  6302.        ║                 temporären Datei, ab der die Variable oder das      ║
  6303.        ║                 Variablenfeld abzulegen ist                         ║
  6304.        ║INTEGER          Return: Fehlerflag                                  ║
  6305.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  6306.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  6307.        ╟─────────────────────────────────────────────────────────────────────╢
  6308.        ║Subroutinen:     ADRESS,PEPO                                         ║
  6309.        ╟─────────────────────────────────────────────────────────────────────╢
  6310.        ║Beispiel:        INTEGER FELD(100),FELD1(100),FELD2(100),SEG         ║
  6311.        ║                 DO 1 I=1,100                                        ║
  6312.        ║                    FELD(I)=1                                        ║
  6313.        ║                    FELD2(I)=0                                       ║
  6314.        ║               1 CONTINUE                                            ║
  6315.        ║                 CALL CREMEM (LOC(FELD),400,SEG,I)                   ║
  6316.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6317.        ║                 CALL GETMEM (LOC(FELD1),400,SEG,I)                  ║
  6318.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6319.        ║                 CALL PUTMEM (LOC(FELD2),400,SEG,I)                  ║
  6320.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6321.        ║                 CALL FREMEM (SEG,I)                                 ║
  6322.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6323.        ║                 GOTO 3                                              ║
  6324.        ║               2 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  6325.        ║                 Mit der Subroutine "CREMEM" werden 400 Byte in der  ║
  6326.        ║                 Memory bzw. in einem temporären File allokiert und  ║
  6327.        ║                 das Integerfeld "FELD" im allokierten Bereich       ║
  6328.        ║                 abgelegt. "GETMEM" liest den allokierten Bereich    ║
  6329.        ║                 in ein Integerfeld "FELD1". Die Subroutine "PUTMEM" ║
  6330.        ║                 überschreibt den allokierten Speicherbereich mit dem║
  6331.        ║                 Integerfeld "FELD2". "FREMEM" gibt den allokierten  ║
  6332.        ║                 Speicherbereich wieder frei. Beim Auftreten eines   ║
  6333.        ║                 Fehlers wird eine Meldung ausgegeben.               ║
  6334.        ╚═════════════════════════════════════════════════════════════════════╝
  6335.     
  6336.  
  6337.                                                                      Seite 158
  6338.  
  6339.  
  6340.        ╔═════════════════════════════════════════════════════════════════════╗
  6341.        ║Beschreibung der Subroutine GETMEM (ADD,LAN,SEG,FLAG)                ║
  6342.        ║Die Subroutine speichert "LAN" Bytes aus der Memory bzw. aus einem   ║
  6343.        ║temporären File in eine Variable oder in ein Variablenfeld, dessen   ║
  6344.        ║Adresse in "ADD" an die Subroutine übergeben wird. In "SEG" wird     ║
  6345.        ║dazu die Adresse des Speicherbereichs an die Routine übergeben. Sie  ║
  6346.        ║ist positiv, wenn der Speicherbereich in der Memory allokiert ist    ║
  6347.        ║(Segment) und sie ist negativ, wenn der Speicherbereich in einer     ║
  6348.        ║temporären Datei zur Verfügung steht (Satznummer). Bei erfolgreicher ║
  6349.        ║Beendigung der Subroutine wird in "FLAG" eine Null, sonst eine Eins  ║
  6350.        ║an das rufende Programm zurückgegeben.                               ║
  6351.        ╟─────────────────────────────────────────────────────────────────────╢
  6352.        ║Parameter:                                                           ║
  6353.        ║INTEGER          Adresse einer Variablen oder eines Variablenfeldes, ║
  6354.        ║                 in das aus der Memory geschrieben werden soll       ║
  6355.        ║                 [ LOC(Variable) ].                                  ║
  6356.        ║INTEGER          Größe der Variable oder des Variablenfeldes in Byte.║
  6357.        ║INTEGER          Positiv: Segmentadresse der Memory, ab der aus der  ║
  6358.        ║                 Memory gelesen werden soll.                         ║
  6359.        ║                 Negativ: Satznummer in der direkt organisierten     ║
  6360.        ║                 temporären Datei, ab der gelesen werden soll.       ║
  6361.        ║INTEGER          Return: Fehlerflag                                  ║
  6362.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  6363.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  6364.        ╟─────────────────────────────────────────────────────────────────────╢
  6365.        ║Subroutinen:     ADRESS,PEPO                                         ║
  6366.        ╟─────────────────────────────────────────────────────────────────────╢
  6367.        ║Beispiel:        INTEGER FELD(100),FELD1(100),FELD2(100),SEG         ║
  6368.        ║                 DO 1 I=1,100                                        ║
  6369.        ║                    FELD(I)=1                                        ║
  6370.        ║                    FELD2(I)=0                                       ║
  6371.        ║               1 CONTINUE                                            ║
  6372.        ║                 CALL CREMEM (LOC(FELD),400,SEG,I)                   ║
  6373.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6374.        ║                 CALL GETMEM (LOC(FELD1),400,SEG,I)                  ║
  6375.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6376.        ║                 CALL PUTMEM (LOC(FELD2),400,SEG,I)                  ║
  6377.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6378.        ║                 CALL FREMEM (SEG,I)                                 ║
  6379.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6380.        ║                 GOTO 3                                              ║
  6381.        ║               2 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  6382.        ║                 Mit der Subroutine "CREMEM" werden 400 Byte in der  ║
  6383.        ║                 Memory bzw. in einem temporären File allokiert und  ║
  6384.        ║                 das Integerfeld "FELD" im allokierten Bereich       ║
  6385.        ║                 abgelegt. "GETMEM" liest den allokierten Bereich    ║
  6386.        ║                 in ein Integerfeld "FELD1". Die Subroutine "PUTMEM" ║
  6387.        ║                 überschreibt den allokierten Speicherbereich mit dem║
  6388.        ║                 Integerfeld "FELD2". "FREMEM" gibt den allokierten  ║
  6389.        ║                 Speicherbereich wieder frei. Beim Auftreten eines   ║
  6390.        ║                 Fehlers wird eine Meldung ausgegeben.               ║
  6391.        ╚═════════════════════════════════════════════════════════════════════╝
  6392.     
  6393.  
  6394.                                                                      Seite 159
  6395.  
  6396.  
  6397.        ╔═════════════════════════════════════════════════════════════════════╗
  6398.        ║Beschreibung der Subroutine FREMEM (SEG,FLAG)                        ║
  6399.        ║Die Subroutine gibt den ab der Adresse "SEG" allokierten Speicher-   ║
  6400.        ║bereich in der Memory oder in einem temporären direkt organisierten  ║
  6401.        ║File frei. Bei erfolgreicher Beendigung der Subroutine wird in "FLAG"║
  6402.        ║eine Null, sonst eine Eins an das rufende Programm zurückgegeben.    ║
  6403.        ║Die Adresse "FLAG" wird Null gesetzt.                                ║
  6404.        ╟─────────────────────────────────────────────────────────────────────╢
  6405.        ║Parameter:                                                           ║
  6406.        ║INTEGER          Positiv: Segmentadresse in der Memory.              ║
  6407.        ║                 Negativ: Satznummer in der direkt organisierten     ║
  6408.        ║                 temporären Datei.                                   ║
  6409.        ║                 Return: Null bei erfolgreichen Abschluß der Routine.║
  6410.        ║INTEGER          Return: Fehlerflag                                  ║
  6411.        ║                 0: Subroutine erfolgreich abgeschlossen.            ║
  6412.        ║                 1: Ein Fehler ist aufgetreten.                      ║
  6413.        ╟─────────────────────────────────────────────────────────────────────╢
  6414.        ║Subroutinen:     REMEM                                               ║
  6415.        ╟─────────────────────────────────────────────────────────────────────╢
  6416.        ║Beispiel:        INTEGER FELD(100),FELD1(100),FELD2(100),SEG         ║
  6417.        ║                 DO 1 I=1,100                                        ║
  6418.        ║                    FELD(I)=1                                        ║
  6419.        ║                    FELD2(I)=0                                       ║
  6420.        ║               1 CONTINUE                                            ║
  6421.        ║                 CALL CREMEM (LOC(FELD),400,SEG,I)                   ║
  6422.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6423.        ║                 CALL GETMEM (LOC(FELD1),400,SEG,I)                  ║
  6424.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6425.        ║                 CALL PUTMEM (LOC(FELD2),400,SEG,I)                  ║
  6426.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6427.        ║                 CALL FREMEM (SEG,I)                                 ║
  6428.        ║                 IF (I .NE. 0) GOTO 2                                ║
  6429.        ║                 GOTO 3                                              ║
  6430.        ║               2 WRITE(*,'(1X,A)') 'Fehler!'                         ║
  6431.        ║                 Mit der Subroutine "CREMEM" werden 400 Byte in der  ║
  6432.        ║                 Memory bzw. in einem temporären File allokiert und  ║
  6433.        ║                 das Integerfeld "FELD" im allokierten Bereich       ║
  6434.        ║                 abgelegt. "GETMEM" liest den allokierten Bereich    ║
  6435.        ║                 in ein Integerfeld "FELD1". Die Subroutine "PUTMEM" ║
  6436.        ║                 überschreibt den allokierten Speicherbereich mit dem║
  6437.        ║                 Integerfeld "FELD2". "FREMEM" gibt den allokierten  ║
  6438.        ║                 Speicherbereich wieder frei. Beim Auftreten eines   ║
  6439.        ║                 Fehlers wird eine Meldung ausgegeben.               ║
  6440.        ╚═════════════════════════════════════════════════════════════════════╝
  6441.     
  6442.  
  6443.                                                                      Seite 160
  6444.  
  6445.  
  6446.        Childprozess und Interruptaufruf
  6447.  
  6448.        Als Childprozess wird ein Programm bezeichnet, das aus einem aktiven
  6449.        Programm heraus aufgerufen und ausgeführt wird.  Während der Ausführung
  6450.        des Childprozesses wartet das rufende Programm, bis es die Kontrolle
  6451.        wieder zurückerhält.  Der Childprozess kann jedes beliebige ausführbare
  6452.        Programm oder ein DOS-Befehl sein.  Es ist möglich, ein sehr großes
  6453.        Programm in mehrere kleine Programme zu untergliedern und jeweils nur
  6454.        das aktuelle Teilprogramm auszuführen.  Dadurch werden Probleme mit dem
  6455.        maximal 640 kB großen adressierbaren Arbeitspeicher unter dem
  6456.        Betriebssystem DOS vermieden.  DOS-Befehle wie DIR oder COPY können als
  6457.        Childprozess aus einem Programm heraus aufgerufen werden.
  6458.  
  6459.        Das Betriebssystem DOS verarbeitet sogenannte Interrupts, um bestimmte,
  6460.        häufig benötigte Vorgänge zur Ausführung zu bringen.  So wird zum
  6461.        Beispiel die Bildschirmausgabe über das Interrupt 10H gesteuert.  Durch
  6462.        die entsprechende Belegung der benötigten Register werden beispielsweise
  6463.        Zeichen ausgegeben, Farben gesetzt, Bildschirmbereiche gescrollt,
  6464.        gelöscht oder gelesen und der Cursor gesetzt.  Neben der
  6465.        Bildschirmgestaltung ist es mit Interruptaufrufen möglich, Einfluß auf
  6466.        die Arbeit der Tastatur, der Disketten und Harddisklaufwerke und auf die
  6467.        anderen elektronischen Komponenten des Personal-Computers zu nehmen.
  6468.  
  6469.  
  6470.        Subroutinen zum Childprozess und zum Interruptaufruf
  6471.  
  6472.        SYS     a) Childprozess zur Ausführung bringen
  6473.        ERRLEV  a) Programm mit ERRORLEVEL beenden
  6474.        GETLEV  a) ERRORLEVEL eines Childprozesses ermitteln
  6475.        INTER   a) Software-Interrupt zur Ausführung bringen
  6476.     
  6477.  
  6478.                                                                      Seite 161
  6479.  
  6480.  
  6481.        ╔═════════════════════════════════════════════════════════════════════╗
  6482.        ║Beschreibung der Subroutine SYS (NAME)                               ║
  6483.        ║Die Subroutine ermöglicht das Aufrufen eines Childprozesses. Die     ║
  6484.        ║Ausführung des rufenden Programms wird unterbrochen, bis der         ║
  6485.        ║aufgerufene Prozess beendet ist. Danach wird die Kontrolle an das    ║
  6486.        ║rufende Programm zurückgegeben.                                      ║
  6487.        ╟─────────────────────────────────────────────────────────────────────╢
  6488.        ║Parameter:                                                           ║
  6489.        ║CHARACTERSTRING  Name des auszuführenden Prozesses. Es müßen die     ║
  6490.        ║                 DOS-Konventionen benutzt werden.                    ║
  6491.        ╟─────────────────────────────────────────────────────────────────────╢
  6492.        ║Beispiele:       CALL SYS ('DIR C:\UTIL')                            ║
  6493.        ║                 CALL SYS ('CHEM1')                                  ║
  6494.        ║                 Im ersten Beispiel werden die Dateien des           ║
  6495.        ║                 Verzeichnisses UTIL im Laufwerk C: am Bildschirm    ║
  6496.        ║                 angezeigt, sofern das Verzeichnis vorhanden ist.    ║
  6497.        ║                 Das zweite Beispiel ruft ein Programm CHEM1 auf.    ║
  6498.        ╚═════════════════════════════════════════════════════════════════════╝
  6499.     
  6500.  
  6501.                                                                      Seite 162
  6502.  
  6503.  
  6504.        ╔══════════════════════════════════════════════════════════════════════╗
  6505.        ║Beschreibung der Subroutine ERRLEV (CODE)                             ║
  6506.        ║Die Subroutine beendet das rufende Programm mit dem in "CODE"         ║
  6507.        ║übergebenen Errorlevel. In einer Batchdatei kann anschließend anhand  ║
  6508.        ║des Errorlevels verzweigt werden (IF ERRORLEVEL .......).             ║
  6509.        ╟──────────────────────────────────────────────────────────────────────╢
  6510.        ║Parameter:                                                            ║
  6511.        ║INTEGER          Errorlevel (Fehlercode) [ 0 bis 255 ].               ║
  6512.        ╟──────────────────────────────────────────────────────────────────────╢
  6513.        ║Beispiel:        READ (1,'(2I3,F8.3)',IOSTAT=I) I,J,A                 ║
  6514.        ║                 IF (I .NE. 0) CALL ERRLEV (3)                        ║
  6515.        ║                 Wenn beim Lesen aus der Datei mit dem Unit 1 ein     ║
  6516.        ║                 Fehler auftritt, wird das Programm mit dem Errorlevel║
  6517.        ║                 3 beendet.                                           ║
  6518.        ╚══════════════════════════════════════════════════════════════════════╝
  6519.     
  6520.  
  6521.                                                                      Seite 163
  6522.  
  6523.  
  6524.        ╔══════════════════════════════════════════════════════════════════════╗
  6525.        ║Beschreibung der Subroutine GETLEV (CODE)                             ║
  6526.        ║Die Subroutine gibt den Errorlevel eines Childprozesses an das        ║
  6527.        ║rufende Programm. Anhand des Errorlevels kann im rufenden Programm    ║
  6528.        ║entsprechend verzweigt werden. Vom Childprozess kann mit Hilfe der    ║
  6529.        ║Subroutine ERRLEV ein Errorcode an das Betriebssystem übergeben       ║
  6530.        ║werden, das mit der Subrooutine GETLEV ausgewertet werden kann.       ║
  6531.        ╟──────────────────────────────────────────────────────────────────────╢
  6532.        ║Parameter:                                                            ║
  6533.        ║INTEGER          Return: Errorlevel (Fehlercode) des Childprozesses   ║
  6534.        ╟──────────────────────────────────────────────────────────────────────╢
  6535.        ║Beispiel         CALL SYS ('CHILD')                                   ║
  6536.        ║                 CALL GETLEV (I)                                      ║
  6537.        ║                 IF (I .NE. 0) THEN                                   ║
  6538.        ║                    WRITE (*,'(1X,A)') 'Childpprogramm fehlerfrei'    ║
  6539.        ║                 ELSE                                                 ║
  6540.        ║                    WRITE (*,'(1X,A)') 'Childpprogramm fehlerhaft'    ║
  6541.        ║                 ENDIF                                                ║
  6542.        ║                 Wenn beim Lesen aus der Datei mit dem Unit 1 ein     ║
  6543.        ║                 Fehler auftritt, wird das Programm mit dem Errorlevel║
  6544.        ║                 3 beendet.                                           ║
  6545.        ╚══════════════════════════════════════════════════════════════════════╝
  6546.     
  6547.  
  6548.                                                                      Seite 164
  6549.  
  6550.  
  6551.        ╔══════════════════════════════════════════════════════════════════════╗
  6552.        ║Beschreibung der Subroutine INTER (IN,AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAG)║
  6553.        ║Die Subroutine ermöglicht die Ausführung eines Software-Interrupts.   ║
  6554.        ║Die Prozessorregister und die Segmentregister DS und ES werden vor dem║
  6555.        ║Aufruf mit den benötigten Inhalten geladen. Nach dem Aufruf mit der   ║
  6556.        ║Interruptnummer in der Variablen "IN" werden die neuen Registerinhalte║
  6557.        ║und das Carryflag an das rufende Programm zurückgegeben.              ║
  6558.        ╟──────────────────────────────────────────────────────────────────────╢
  6559.        ║Parameter:                                                            ║
  6560.        ║INTEGER          Nummer des zur Ausführung kommenden Interrupts.      ║
  6561.        ║                 Return: 0 wenn ungültige Interruptnummer übergeben   ║
  6562.        ║                 wurde.                                               ║
  6563.        ║INTEGER          Inhalt für das AX-Register.                          ║
  6564.        ║                 Return: Inhalt des AX-Registers nach der Ausführung. ║
  6565.        ║INTEGER          Inhalt für das BX-Register.                          ║
  6566.        ║                 Return: Inhalt des BX-Registers nach der Ausführung. ║
  6567.        ║INTEGER          Inhalt für das CX-Register.                          ║
  6568.        ║                 Return: Inhalt des CX-Registers nach der Ausführung. ║
  6569.        ║INTEGER          Inhalt für das DX-Register.                          ║
  6570.        ║                 Return: Inhalt des DX-Registers nach der Ausführung. ║
  6571.        ║INTEGER          Inhalt für das BP-Register.                          ║
  6572.        ║                 Return: Inhalt des BP-Registers nach der Ausführung. ║
  6573.        ║INTEGER          Inhalt für das SI-Register.                          ║
  6574.        ║                 Return: Inhalt des SI-Registers nach der Ausführung. ║
  6575.        ║INTEGER          Inhalt für das DI-Register.                          ║
  6576.        ║                 Return: Inhalt des DI-Registers nach der Ausführung. ║
  6577.        ║INTEGER          Inhalt für das DS-Register.                          ║
  6578.        ║                 Return: Inhalt des DS-Registers nach der Ausführung. ║
  6579.        ║INTEGER          Inhalt für das ES-Register.                          ║
  6580.        ║                 Return: Inhalt des ES-Registers nach der Ausführung. ║
  6581.        ║INTEGER          Return: 1: Carryflag gesetzt                         ║
  6582.        ║                         0: Carryflag nicht gesetzt                   ║
  6583.        ╟──────────────────────────────────────────────────────────────────────╢
  6584.        ║                 INTEGER IN,AX                                        ║
  6585.        ║                 IN=#21                                               ║
  6586.        ║                 AX=#3000                                             ║
  6587.        ║                 CALL INTER (IN,AX,0,0,0,0,0,0,0,0,0)                 ║
  6588.        ║                 Das Programms ruft das Interrupt 21H, Funktion 30H   ║
  6589.        ║                 auf, das im AX-Register Informationen über die       ║
  6590.        ║                 benutzte MS-DOS-Version zurückgibt.                  ║
  6591.        ╚══════════════════════════════════════════════════════════════════════╝
  6592.     
  6593.  
  6594.                                                                      Seite 165
  6595.  
  6596.  
  6597.        Verschiedene Routinen
  6598.  
  6599.        In dieser Rubrik sind Subroutinen zusammengestellt, deren Wirkung keiner
  6600.        Gruppe zugeordnet werden kann.
  6601.  
  6602.  
  6603.        Verschiedene Subroutinen
  6604.  
  6605.        CPOS    a) Cursor auf dem Bildschirm positionieren
  6606.        CTYP    a) Form des Cursors ändern
  6607.                b) Cursor ausschalten
  6608.                c) Cursor wieder einschalten
  6609.        CONTCA  a) Abbruch eines Programms durch "CONTROL-C" und "CONTROL-BREAK"
  6610.                   verhindern
  6611.        CONTCE  a) Abbruch eines Programms durch "CONTROL-C" und "CONTROL-BREAK"
  6612.                   wieder ermöglichen
  6613.        CTBUF   a) Im Tastaturpuffer vorhandene Zeichen löschen
  6614.        DRUOP   a) Druckerunit öffnen und Druckerstatus abfragen
  6615.        DRUST   a) Druckerstatus abfragen
  6616.        GETDAY  a) Kennziffer für den aktuellen Wochentag ermitteln
  6617.        INV24   a) Serielle Schnittstelle öffnen und konfigurieren
  6618.        REV24   a) String aus der seriellen Schnittstelle lesen
  6619.        MAUS    a) Emulation von Keyboard-Tasten durch eine MICROSOFT-kompatible
  6620.                   Maus
  6621.                b) Ausschalten der Maus-Emulation
  6622.                b) Wiederherstellen des ursprünglichen Mausstatus
  6623.        PSP     a) Inhalt der Programmsegmentpräfix in eine Charactervariable
  6624.                   lesen
  6625.        PARAM   a) Parameter aus der Kommandozeile zur Verfügung stellen
  6626.        TASMOD  a) Aktuellen Tastaturmodus ermitteln
  6627.                b) Neuen Tastaturmodus setzen
  6628.        SCPRF   a) Segmentadresse des Bildschirmspeichers ermitteln
  6629.        VIDMOD  a) Aktuellen Videomodus ermitteln
  6630.                b) Neuen Videomodus setzen und Bildschirminhalt löschen
  6631.                c) Neuen Videomodus setzen und Bildschirminhalt erhalten
  6632.     
  6633.  
  6634.                                                                      Seite 166
  6635.  
  6636.  
  6637.        ╔══════════════════════════════════════════════════════════════════════╗
  6638.        ║Beschreibung der Subroutine CPOS (ZEILE,SPALTE)                       ║
  6639.        ║Die Subroutine positioniert den Cursor auf dem Bildschirm in der vom  ║
  6640.        ║Programm übergebenen Zeile und Spalte.                                ║
  6641.        ╟──────────────────────────────────────────────────────────────────────╢
  6642.        ║Parameter:                                                            ║
  6643.        ║INTEGER          Bildschirmzeile.                                     ║
  6644.        ║INTEGER          Bildschirmspalte.                                    ║
  6645.        ╟──────────────────────────────────────────────────────────────────────╢
  6646.        ║Beispiel:        CALL CPOS (10,5)                                     ║
  6647.        ║                 Der Cursor wird in der 1o. Zeile und 5. Spalte       ║
  6648.        ║                 positioniert.                                        ║
  6649.        ╚══════════════════════════════════════════════════════════════════════╝
  6650.     
  6651.  
  6652.                                                                      Seite 167
  6653.  
  6654.  
  6655.        ╔══════════════════════════════════════════════════════════════════════╗
  6656.        ║Beschreibung der Subroutine CTYP (ANFANG,ENDE)                        ║
  6657.        ║Die Subroutine setzt die Höhe und die Position des Cursors innerhalb  ║
  6658.        ║einer Bildschirmtextzeile. Wenn beide Parameter Null gesetzt werden,  ║
  6659.        ║wird der Cursor ausgeschaltet. Wenn beide Parameter eins gesetzt      ║
  6660.        ║werden, wird der Cursor auf die normalen Werte gesetzt. Mit allen     ║
  6661.        ║anderen Werten kann die Form des Cursors variiert werden.             ║
  6662.        ╟──────────────────────────────────────────────────────────────────────╢
  6663.        ║Parameter:                                                            ║
  6664.        ║INTEGER          Pixelzeile in der Bildschirmtextzeile, in der der    ║
  6665.        ║                 Cursor beginnt [0 bis 31].                           ║
  6666.        ║INTEGER          Pixelzeile in der Bildschirmtextzeile, in der der    ║
  6667.        ║                 Cursor endet  [0 bis 31].                            ║
  6668.        ╟──────────────────────────────────────────────────────────────────────╢
  6669.        ║Beispiele:       CALL CTYP (5,7)                                      ║
  6670.        ║                 Ein drei Pixelzeilen hoher Cursor wird am Fuß der    ║
  6671.        ║                 Bildschirmtextzeile gesetzt.                         ║
  6672.        ║                 CALL CTYP (0,0)                                      ║
  6673.        ║                 Der Cursor wird ausgeschaltet.                       ║
  6674.        ║                 CALL CTYP (1,1)                                      ║
  6675.        ║                 Der für den jeweiligen Bildschirmmodus übliche       ║
  6676.        ║                 Cursortyp wird gesetzt.                              ║
  6677.        ╚══════════════════════════════════════════════════════════════════════╝
  6678.     
  6679.  
  6680.                                                                      Seite 168
  6681.  
  6682.  
  6683.        ╔══════════════════════════════════════════════════════════════════════╗
  6684.        ║Beschreibung der Subroutine CONTCA ()                                 ║
  6685.        ║Die Subroutine verhindert den Abbruch des rufenden Programms durch das║
  6686.        ║Betätigen der Tastenkombination CONTROL-C oder CONTROL-BREAK. Vor der ║
  6687.        ║Beendigung des rufenden Programms sollte die Subroutine CONTCE        ║
  6688.        ║aufgerufen werden, um den Tastenkombinationen die ursprüngliche       ║
  6689.        ║Bestimmung zurückzugeben.                                             ║
  6690.        ╟──────────────────────────────────────────────────────────────────────╢
  6691.        ║Parameter:       keine                                                ║
  6692.        ╟──────────────────────────────────────────────────────────────────────╢
  6693.        ║Beispiel:        CALL CONTCA ()                                       ║
  6694.        ║                 Im weiteren Programmablauf lösen die Tasten-         ║
  6695.        ║                 kombinationen CONTROL-C und CONTROL-BREAK keine      ║
  6696.        ║                 Aktion mehr aus, bis die Subroutine CONTCE aufgerufen║
  6697.        ║                 wird.                                                ║
  6698.        ║                                                                      ║
  6699.        ╚══════════════════════════════════════════════════════════════════════╝
  6700.     
  6701.  
  6702.                                                                      Seite 169
  6703.  
  6704.  
  6705.        ╔=═════════════════════════════════════════════════════════════════════╗
  6706.        ║Beschreibung der Subroutine CONTCE ()                                 ║
  6707.        ║Wenn mit der Subroutine CONTCA der Abbruch des rufenden Programms     ║
  6708.        ║durch das Betätigen der Tastenkombination CONTROL-C oder CONTROL-BREAK║
  6709.        ║verhindert wurde, werden den Tastenkombinationen durch die Subroutine ║
  6710.        ║die ursprünglichen Bestimmungen zurückgegeben.                        ║
  6711.        ╟──────────────────────────────────────────────────────────────────────╢
  6712.        ║Parameter:       keine                                                ║
  6713.        ╟──────────────────────────────────────────────────────────────────────╢
  6714.        ║Beispiel:        CALL CONTCE ()                                       ║
  6715.        ║                 Im weiteren Programmablauf lösen die Tasten-         ║
  6716.        ║                 kombinationen CONTROL-C und CONTROL-BREAK wieder die ║
  6717.        ║                 ihnen ursprünglich zugewiesenen Aktionen aus.        ║
  6718.        ╚=═════════════════════════════════════════════════════════════════════╝
  6719.     
  6720.  
  6721.                                                                      Seite 170
  6722.  
  6723.  
  6724.        ╔══════════════════════════════════════════════════════════════════════╗
  6725.        ║Beschreibung der Subroutine CTBUF ()                                  ║
  6726.        ║Die Subroutine löscht alle im Tastaturringpuffer vorhandenen Zeichen. ║
  6727.        ╟──────────────────────────────────────────────────────────────────────╢
  6728.        ║Parameter:       keine                                                ║
  6729.        ╟──────────────────────────────────────────────────────────────────────╢
  6730.        ║Beispiel:        CALL CTBUF ()                                        ║
  6731.        ║                 Alle im Tastaturpuffer vorhandenen Zeichen sind      ║
  6732.        ║                 gelöscht worden.                                     ║
  6733.        ╚══════════════════════════════════════════════════════════════════════╝
  6734.     
  6735.  
  6736.                                                                      Seite 171
  6737.  
  6738.  
  6739.        ╔═════════════════════════════════════════════════════════════════════╗
  6740.        ║Beschreibung der Subroutine DRUOP (UNI,STATUS)                       ║
  6741.        ║Die Subroutine überprüft die Betriebsbereitschaft des Druckers.      ║
  6742.        ║Wenn der Drucker nicht betriebsbereit ist, wird in "STATUS" eine 0   ║
  6743.        ║zurückgegeben, andernfalls eine 1. Wenn der Drucker mit der in "UNI" ║
  6744.        ║übergebenen Nummer noch nicht geöffnet worden ist, wird er geöffnet. ║
  6745.        ╟─────────────────────────────────────────────────────────────────────╢
  6746.        ║Parameter:                                                           ║
  6747.        ║INTEGER          Unit für den Drucker.                               ║
  6748.        ║INTEGER          Return: Status des Druckers:                        ║
  6749.        ║                         0: Drucker ist nicht betriebsbereit.        ║
  6750.        ║                         1: Drucker ist betriebsbereit und eröffnet. ║
  6751.        ╟─────────────────────────────────────────────────────────────────────╢
  6752.        ║Subroutinen:     DRUST                                               ║
  6753.        ╟─────────────────────────────────────────────────────────────────────╢
  6754.        ║Beispiel:      1 CALL DRUOP (3,ISTAT)                                ║
  6755.        ║                 IF (ISTAT .EQ. 0) THEN                              ║
  6756.        ║                    WRITE(*,'(1X,A)') 'Drucker einschalten!'         ║
  6757.        ║                    GOTO 1                                           ║
  6758.        ║                 ENDIF                                               ║
  6759.        ║                 Die Schleife wird erst verlassen, wenn der Drucker  ║
  6760.        ║                 betriebsbereit ist.                                 ║
  6761.        ╚═════════════════════════════════════════════════════════════════════╝
  6762.     
  6763.  
  6764.                                                                      Seite 172
  6765.  
  6766.  
  6767.        ╔══════════════════════════════════════════════════════════════════════╗
  6768.        ║Beschreibung der Subroutine DRUST (DRU)                               ║
  6769.        ║Die Subroutine erfragt den Status eines Druckers. Die Nummer des      ║
  6770.        ║Druckers wird in "DRU" übergeben. Wenn der Drucker betriebsbereit ist,║
  6771.        ║wird in "DRU" eine 1, sonst eine 0 zurückgegeben.                     ║
  6772.        ╟──────────────────────────────────────────────────────────────────────╢
  6773.        ║Parameter:                                                            ║
  6774.        ║INTEGER          Nummer des Druckers [1 bis n].                       ║
  6775.        ║                 Return: Druckerstatus: 1: Drucker betriebsbereit     ║
  6776.        ║                                        0: Drucker nicht bereit       ║
  6777.        ╟──────────────────────────────────────────────────────────────────────╢
  6778.        ║Beispiel:        I=1                                                  ║
  6779.        ║                 CALL DRUST (I)                                       ║
  6780.        ║                 IF (I .EQ. 1) OPEN (1,FILE='PRN',STATUS='OLD')       ║
  6781.        ║                 Der Drucker wird nur dann unter dem Unit 1 eröffnet, ║
  6782.        ║                 wenn er betriebsbereit ist.                          ║
  6783.        ╚══════════════════════════════════════════════════════════════════════╝
  6784.     
  6785.  
  6786.                                                                      Seite 173
  6787.  
  6788.  
  6789.        ╔══════════════════════════════════════════════════════════════════════╗
  6790.        ║Beschreibung der Subroutine GETDAY (TAG)                              ║
  6791.        ║Die Subroutine gibt in einer Variablen eine Kennziffer für den        ║
  6792.        ║aktuellen Wochentag zurück.                                           ║
  6793.        ╟──────────────────────────────────────────────────────────────────────╢
  6794.        ║Parameter:                                                            ║
  6795.        ║INTEGER          Return: Kennziffer für den aktuellen Wochentag:      ║
  6796.        ║                 1: Montag                                            ║
  6797.        ║                 2: Dienstag                                          ║
  6798.        ║                 3: Mittwoch                                          ║
  6799.        ║                 4: Donnerstag                                        ║
  6800.        ║                 5: Freitag                                           ║
  6801.        ║                 6: Samstag                                           ║
  6802.        ║                 7: Sonntag                                           ║
  6803.        ╟──────────────────────────────────────────────────────────────────────╢
  6804.        ║Beispiel:        CALL GETDAY (I)                                      ║
  6805.        ║                 In der Variablen wird die Kennziffer für den         ║
  6806.        ║                 aktuellen Wochentag zurückgegeben.                   ║
  6807.        ╚══════════════════════════════════════════════════════════════════════╝
  6808.     
  6809.  
  6810.                                                                      Seite 174
  6811.  
  6812.  
  6813.        ╔══════════════════════════════════════════════════════════════════════╗
  6814.        ║Beschreibung der Subroutine INV24 (PORT,KONFIG)                       ║
  6815.        ║Die Subroutine konfiguriert eine serielle Schnittstelle. Die Nummer   ║
  6816.        ║der Schnittstelle wird in "PORT" übergeben. Wenn die Schnittstelle    ║
  6817.        ║nicht vorhanden ist, wird in "PORT" eine 0 zurückgegeben. In "KONFIG" ║
  6818.        ║werden die Konfigurationen übergeben.                                 ║
  6819.        ╟──────────────────────────────────────────────────────────────────────╢
  6820.        ║Parameter:                                                            ║
  6821.        ║INTEGER          Nummer der seriellen Schnittstelle [1 bis 4]         ║
  6822.        ║                 Return: 0 wenn Schnittstelle nicht vorhanden ist     ║
  6823.        ║INTEGER          Konfiguration der Schnittstelle:                     ║
  6824.        ║                 Bits 7  6  5: Übertragungsgeschwindigkeit            ║
  6825.        ║                      0  0  0   110 Baud                              ║
  6826.        ║                      0  0  1   150 Baud                              ║
  6827.        ║                      0  1  0   300 Baud                              ║
  6828.        ║                      0  1  1   600 Baud                              ║
  6829.        ║                      1  0  0  1200 Baud                              ║
  6830.        ║                      1  0  1  2400 Baud                              ║
  6831.        ║                      1  1  0  4800 Baud                              ║
  6832.        ║                      1  1  1  9600 Baud                              ║
  6833.        ║                 Bits 4  3: Paritätskontrolle                         ║
  6834.        ║                      0  0     kein Paritätsbit                       ║
  6835.        ║                      0  1     ungerade Parität                       ║
  6836.        ║                      1  1     gerade Parität                         ║
  6837.        ║                 Bit  2: Zahl der Stopbits                            ║
  6838.        ║                      0        ein Stopbit                            ║
  6839.        ║                      1        zwei Stopbits                          ║
  6840.        ║                 Bits 1  0: Datenwortlänge                            ║
  6841.        ║                      1  0     7 Bit Datenwort                        ║
  6842.        ║                      1  1     8 Bit Datenwort                        ║
  6843.        ╟──────────────────────────────────────────────────────────────────────╢
  6844.        ║Beispiel:        I=3                                                  ║
  6845.        ║                 CALL INV24 (I,251)                                   ║
  6846.        ║                 IF (I .EQ. 1) WRITE(*,'(1X,A)') 'Fehler!'            ║
  6847.        ║                 Wenn die serielle Schnittstelle mit der Nummer 3     ║
  6848.        ║                 vorhanden ist, wird sie mit 9600 Baud, gerader       ║
  6849.        ║                 Parität, einem Stopbit und 8 Bit Wortlänge           ║
  6850.        ║                 konfiguriert. Wenn die Schnittstelle nicht vorhanden ║
  6851.        ║                 ist, wird eine Fehlermeldung ausgegeben.             ║
  6852.        ╚══════════════════════════════════════════════════════════════════════╝
  6853.     
  6854.  
  6855.                                                                      Seite 175
  6856.  
  6857.  
  6858.        ╔══════════════════════════════════════════════════════════════════════╗
  6859.        ║Beschreibung der Subroutine REV24 (PORT,ANZ,STRING)                   ║
  6860.        ║Die Subroutine liest aus der in "PORT" übergebenen seriellen          ║
  6861.        ║Schnittstelle einen String. Die Leseroutine wird beendet, wenn die    ║
  6862.        ║Anzahl "ANZ" Zeichen erreicht ist, wenn ein Return-Code gelesen wird, ║
  6863.        ║oder wenn ein Fehler auftritt. Null-Characters werden überlesen.      ║
  6864.        ║Der nicht beschriebene Teil des Strings wird mit Blanks aufgefüllt.   ║
  6865.        ║Die Schnittstelle muß bereits initialisiert sein. Dazu eignet sich die║
  6866.        ║Subroutine INV24.                                                     ║
  6867.        ╟──────────────────────────────────────────────────────────────────────╢
  6868.        ║Parameter:                                                            ║
  6869.        ║INTEGER          Nummer der seriellen Schnittstelle [1 bis 4]         ║
  6870.        ║INTEGER          Anzahl der zu lesenden Zeichen                       ║
  6871.        ║CHARACTERSTRING  Return: Aus der seriellen Schnittstelle gelesene     ║
  6872.        ║                         Zeichen [ STRING*(ANZ) ]                     ║
  6873.        ╟──────────────────────────────────────────────────────────────────────╢
  6874.        ║Beispiel:        CHARACTER STRING*30                                  ║
  6875.        ║                 I=3                                                  ║
  6876.        ║                 CALL INV24 (I,251)                                   ║
  6877.        ║                 IF (I .NE. 0) WRITE(*,'(1X,A)') 'Fehler!'            ║
  6878.        ║                 CALL REV24 (3,30,STRING)                             ║
  6879.        ║                 WRITE(*,'(1X,A)') STRING                             ║
  6880.        ║                 Wenn die serielle Schnittstelle mit der Nummer 3     ║
  6881.        ║                 vorhanden ist, wird sie mit 9600 Baud, gerader       ║
  6882.        ║                 Parität, einem Stopbit und 8 Bit Wortlänge           ║
  6883.        ║                 konfiguriert. Wenn die Schnittstelle nicht vorhanden ║
  6884.        ║                 ist, wird eine Fehlermeldung ausgegeben. Danach wird ║
  6885.        ║                 ein String mit maximal 30 Zeichen aus der            ║
  6886.        ║                 Schnittstelle gelesen.                               ║
  6887.        ╚══════════════════════════════════════════════════════════════════════╝
  6888.     
  6889.  
  6890.                                                                      Seite 176
  6891.  
  6892.  
  6893.        ╔══════════════════════════════════════════════════════════════════════╗
  6894.        ║Beschreibung der Subroutine MAUS (TR,TL,RECHTS,LINKS,AUF,AB,SENS)     ║
  6895.        ║Die Subroutine ordnet den Tasten und Richtungen einer installierten   ║
  6896.        ║MIROSOFT-kompatiblen Maus definierte Keyboard-Tastendrücke zu. Dadurch║
  6897.        ║kann die Tastatur mit Hilfe der Maus simuliert werden. Die Tastatur   ║
  6898.        ║kann dabei weiterhin uneingeschränkt parallel zur Maus bedient werden.║
  6899.        ║Die Empfindlichkeit der Maus wird mit SENS eingestellt. Zum Schluß des║
  6900.        ║Programms muß die Subroutine mit SENS gleich Null nochmals aufgerufen ║
  6901.        ║werden, damit die Maus ihre ursprüngliche Funktion zurückerhält. Mit  ║
  6902.        ║der Subroutine können einfache Menüsteuerungen aufgebaut werden.      ║
  6903.        ╟──────────────────────────────────────────────────────────────────────╢
  6904.        ║Parameter:                                                            ║
  6905.        ║INTEGER          Bitmuster zur Emulation einer Keybord-Taste durch die║
  6906.        ║                 rechte Maustaste:                                    ║
  6907.        ║                      0: kein Tastaturäquivalent                      ║
  6908.        ║                      1: <Return-Taste>                               ║
  6909.        ║                      2: <Cursor rechts>-Taste                        ║
  6910.        ║                      4: <Cursor links>-Taste                         ║
  6911.        ║                      8: <Cursor aufwärts>-Taste                      ║
  6912.        ║                     16: <Cursor abwärts>-Taste                       ║
  6913.        ║                     32: <Bild aufwärts>-Taste                        ║
  6914.        ║                     64: <Bild abwärts>-Taste                         ║
  6915.        ║                    128: <Tabulator rechts>-Taste                     ║
  6916.        ║                    256: <Tabulator links>-Taste                      ║
  6917.        ║                    512: <Escape>-Taste                               ║
  6918.        ║                   1024: <F1>-Taste                                   ║
  6919.        ║                   2048: <F2>-Taste                                   ║
  6920.        ║                   4096: <F3>-Taste                                   ║
  6921.        ║                   8192: <F4>-Taste                                   ║
  6922.        ║                  16384: <F5>-Taste                                   ║
  6923.        ║                  32768: <F6>-Taste                                   ║
  6924.        ║                  65536: <F7>-Taste                                   ║
  6925.        ║                 131072: <F8>-Taste                                   ║
  6926.        ║                 262144: <F9>-Taste                                   ║
  6927.        ║                 524288: <F10>-Taste                                  ║
  6928.        ║INTEGER          Bitmuster zur Emulation einer Keybord-Taste durch die║
  6929.        ║                 linke Maustaste:                                     ║
  6930.        ║                 wie im ersten Parameter                              ║
  6931.        ║INTEGER          Bitmuster zur Emulation einer Keybord-Taste durch die║
  6932.        ║                 Bewegung der Maus nach rechts:                       ║
  6933.        ║                 wie im ersten Parameter                              ║
  6934.        ║INTEGER          Bitmuster zur Emulation einer Keybord-Taste durch die║
  6935.        ║                 Bewegung der Maus nach links:                        ║
  6936.        ║                 wie im ersten Parameter                              ║
  6937.        ║INTEGER          Bitmuster zur Emulation einer Keybord-Taste durch die║
  6938.        ║                 Bewegung der Maus nach oben:                         ║
  6939.        ║                 wie im ersten Parameter                              ║
  6940.        ║INTEGER          Bitmuster zur Emulation einer Keybord-Taste durch die║
  6941.        ║                 Bewegung der Maus nach unten:                        ║
  6942.        ║                 wie im ersten Parameter                              ║
  6943.        ║INTEGER          Empfindlichkeit der Maus  [1 bis 16]                 ║
  6944.        ║                          1:  geringe Empfindlichkeit                 ║
  6945.        ║                         16:  hohe Empfindlichkeit                    ║
  6946.        ║                 oder:    0:  Wiederherstellen der ursprünglichen     ║
  6947.        ║                              Mausfunktionen                          ║
  6948.     
  6949.  
  6950.                                                                      Seite 177
  6951.  
  6952.  
  6953.        ║                 Return: -1:  Mausstatus:  kein Maustreiber vorhanden ║
  6954.        ╟──────────────────────────────────────────────────────────────────────╢
  6955.        ║Beispiel:        SENS=5                                               ║
  6956.        ║                 CALL MAUS (1,512,2,4,8,16,SENS)                      ║
  6957.        ║                 Die Escape- und Return-Tasten werden von den Maus-   ║
  6958.        ║                 tasten emuliert. Die Cursortasten werden durch die   ║
  6959.        ║                 Mausbewegungen emuliert. Wenn in SENS eine -1 steht, ║
  6960.        ║                 ist kein Maustreiber vorhanden.                      ║
  6961.        ╚══════════════════════════════════════════════════════════════════════╝
  6962.     
  6963.  
  6964.                                                                      Seite 178
  6965.  
  6966.  
  6967.        ╔══════════════════════════════════════════════════════════════════════╗
  6968.        ║Beschreibung der Subroutine PSP (ANZ,STRING)                          ║
  6969.        ║Aus der Programmsegmentpräfix (PSP) werden die beim Programmaufruf in ║
  6970.        ║der Kommandozeile aufgeführten Parameter ausgelesen und als String an ║
  6971.        ║das rufende Programm zurückgegeben. Die Anzahl der aus der PSP        ║
  6972.        ║übernommenen Zeichen wird in ANZ übergeben.                           ║
  6973.        ╟──────────────────────────────────────────────────────────────────────╢
  6974.        ║Parameter:                                                            ║
  6975.        ║INTEGER          Return: Anzahl der aus der PSP ausgelesenen und in   ║
  6976.        ║                 STRING übergebenen Zeichen.                          ║
  6977.        ║CHARACTERSTRING  Return: String mit beim Programmaufruf übergebenen   ║
  6978.        ║                 Parametern [ STRING*128 ].                           ║
  6979.        ╟──────────────────────────────────────────────────────────────────────╢
  6980.        ║Beispiel:        CHARACTER STRING*128                                 ║
  6981.        ║                 CALL PSP (I,STRING)                                  ║
  6982.        ║                 In STRING werden die beim Programmaufruf übergebenen ║
  6983.        ║                 Parameter geschrieben. In I steht die Anzahl der aus ║
  6984.        ║                 der PSP gelesenen Zeichen.                           ║
  6985.        ╚══════════════════════════════════════════════════════════════════════╝
  6986.     
  6987.  
  6988.                                                                      Seite 179
  6989.  
  6990.  
  6991.        ╔═════════════════════════════════════════════════════════════════════╗
  6992.        ║Beschreibung der Subroutine PARAM (ANZ,PFELD)                        ║
  6993.        ║Die Subroutine schreibt eine Anzahl "ANZ" der beim Programmaufruf    ║
  6994.        ║übergebenen Parameter in ein Characterfeld "PFELD". Beim Programm-   ║
  6995.        ║aufruf dürfen die Parameter durch Blanks, Kommata oder Slashs        ║
  6996.        ║voneinander getrennt sein. Fehlende Parameter in einer Parameterliste║
  6997.        ║können durch ein Komma oder durch einen Slash ersetzt sein. Führende ║
  6998.        ║Blanks werden ignoriert. Wenn weniger Parameter gefunden werden, als ║
  6999.        ║in "ANZ" erwartet, so wird in "ANZ" die Anzahl der tatsächlich       ║
  7000.        ║gefundenen Parameter an das rufende Programm zurückgegeben.          ║
  7001.        ╟─────────────────────────────────────────────────────────────────────╢
  7002.        ║Parameter:                                                           ║
  7003.        ║INTEGER          Anzahl der erwarteten Parameter.                    ║
  7004.        ║                 Return: Anzahl der gefundenen Parameter.            ║
  7005.        ║CHARACTERFELD    Return: Feld mit den gefundenen Parametern.         ║
  7006.        ║                 [ gewünschte Parameterlänge * Anzahl! ]             ║
  7007.        ╟─────────────────────────────────────────────────────────────────────╢
  7008.        ║Subroutinen:     PSP,LAENGE                                          ║
  7009.        ╟─────────────────────────────────────────────────────────────────────╢
  7010.        ║Beispiel:        CHARACTER PFELD*30(2)                               ║
  7011.        ║                 I=2                                                 ║
  7012.        ║                 CALL PARAM (I,PFELD)                                ║
  7013.        ║                 IF (I .NE. 2) WRITE(*,'(1X,A)') 'FEHLER'            ║
  7014.        ║                 Es werden die ersten zwei beim Programmaufruf       ║
  7015.        ║                 angegebenen Parameter in das Feld "PFELD"           ║
  7016.        ║                 geschrieben. Wenn kein oder weniger als zwei        ║
  7017.        ║                 Parameter vorhanden sind, wird eine Fehlermeldung   ║
  7018.        ║                 ausgegeben.                                         ║
  7019.        ╚═════════════════════════════════════════════════════════════════════╝
  7020.     
  7021.  
  7022.                                                                      Seite 180
  7023.  
  7024.  
  7025.        ╔═════════════════════════════════════════════════════════════════════╗
  7026.        ║Beschreibung der Subroutine TASMOD (SET,GET)                         ║
  7027.        ║Die Routine liest den aktuellen Tastaturmodus in GET ein und gibt ihn║
  7028.        ║an das rufende Programm zurück. Danach wird der neue tastaturmodus   ║
  7029.        ║aus SET gesetzt. Die verschiedenen Zustände der tastatur sind dem    ║
  7030.        ║folgenden Bitmuster entsprechend  "AND"-verknüpft:                   ║
  7031.        ║    11111111 11111111   DEZ   Zustand                                ║
  7032.        ║    ││││││││ │││││││└     1   Shifttaste rechts gedrückt             ║
  7033.        ║    ││││││││ ││││││└─     2   Shifttaste links gedrückt              ║
  7034.        ║    ││││││││ │││││└──     4   Controltaste rechts oder links gedrückt║
  7035.        ║    ││││││││ ││││└───     8   Alttaste rechts oder links gedrückt    ║
  7036.        ║    ││││││││ │││└────    16   Scroll-lock eingeschaltet              ║
  7037.        ║    ││││││││ ││└─────    32   Num-lock eingeschaltet                 ║
  7038.        ║    ││││││││ │└──────    64   Caps-lock eingeschaltet                ║
  7039.        ║    ││││││││ └───────   128   Insert eingeschaltet                   ║
  7040.        ║    ││││││││                                                         ║
  7041.        ║    │││││││└─────────   256   Controltaste links gedrückt            ║
  7042.        ║    ││││││└──────────   512   Alttaste links gedrückt                ║
  7043.        ║    │││││└───────────  1024   Ohne Auswirkung                        ║
  7044.        ║    ││││└────────────  2048   Pause eingeschaltet                    ║
  7045.        ║    │││└─────────────  4096   Scroll-lock-Taste gedrückt             ║
  7046.        ║    ││└──────────────  8192   Num-lock-Taste gedrückt                ║
  7047.        ║    │└─────────────── 16384   Caps-lock-Taste gedrückt               ║
  7048.        ║    └──────────────── 32768   Insert-Taste gedrückt                  ║
  7049.        ╟─────────────────────────────────────────────────────────────────────╢
  7050.        ║Parameter:                                                           ║
  7051.        ║INTEGER          Zu setzender Tastaturmodus.                         ║
  7052.        ║INTEGER          Return: Alter Tastaturmodus.                        ║
  7053.        ╟─────────────────────────────────────────────────────────────────────╢
  7054.        ║Subroutinen:     PEEK,POKE                                           ║
  7055.        ╟─────────────────────────────────────────────────────────────────────╢
  7056.        ║Beispiel:        CALL TASMOD (96,I)                                  ║
  7057.        ║                 Der aktuelle Tastaturmodus wird in die Variable I   ║
  7058.        ║                 geschrieben, damit er später wieder in den          ║
  7059.        ║                 ursprünglichen Zustand gesetzt werden kann. Dann    ║
  7060.        ║                 werden Num-lock und Caps-lock eingeschaltet.        ║
  7061.        ╚═════════════════════════════════════════════════════════════════════╝
  7062.     
  7063.  
  7064.                                                                      Seite 181
  7065.  
  7066.  
  7067.        ╔══════════════════════════════════════════════════════════════════════╗
  7068.        ║Beschreibung der Subroutine SCPRF (SEGMENT)                           ║
  7069.        ║Die Subroutine gibt die Segmentadresse des Bildschirmspeichers in der ║
  7070.        ║Variablen SEGMENT an das rufende Programm zurück. Sie ist #0B000 beim ║
  7071.        ║Betrieb mit einem Monochromemonitor und #0B800 beim Betrieb mit einem ║
  7072.        ║Farbmonitor.                                                          ║
  7073.        ╟──────────────────────────────────────────────────────────────────────╢
  7074.        ║Parameter:                                                            ║
  7075.        ║INTEGER          Return: Segmentadresse des Bildschirmspeichers:      ║
  7076.        ║                 #0B000: Monochromemonitor                            ║
  7077.        ║                 #0B800: Farbmonitor                                  ║
  7078.        ╟──────────────────────────────────────────────────────────────────────╢
  7079.        ║Beispiel:        CALL SCPRF (SEGM)                                    ║
  7080.        ║                 In der Variablen SEGM wird beim Betrieb mit einem    ║
  7081.        ║                 Monochromemonitor #0B000 oder beim Betrieb mit einem ║
  7082.        ║                 Farbmonitor #0B800 an das rufende Programm zurück-   ║
  7083.        ║                 gegeben.                                             ║
  7084.        ╚══════════════════════════════════════════════════════════════════════╝
  7085.     
  7086.  
  7087.                                                                      Seite 182
  7088.  
  7089.  
  7090.        ╔══════════════════════════════════════════════════════════════════════╗
  7091.        ║Beschreibung der Subroutine VIDMOD (NEUMOD,ALTMOD,CLSFLAG)            ║
  7092.        ║Die Subroutine liest den aktuellen Videomodus und gibt ihn in der     ║
  7093.        ║Variablen ALTMOD an das rufende Programm zurück. Danach wird geprüft, ║
  7094.        ║od der neu zu setzende Videomodus NEUMOD zur Hardwarekonfiguration von║
  7095.        ║Videokarte und Bildschirm paßt. Wenn das der Fall ist, wird der neue  ║
  7096.        ║Videomodus gesetzt, wenn nicht, bleibt der alte Videomodus erhalten   ║
  7097.        ║und in CLSFLAG wird eine 0 zurückgegeben. Das Löschen des Bildschirms ║
  7098.        ║beim Aktivieren eines neuen Videomodus wird werhindert, wenn in       ║
  7099.        ║CLSFLAG eine 2 übergeben wird. Eine 1 in CLSFLAG löscht den Bildschirm║
  7100.        ║beim Aktivieren des neuen Videomodus.                                 ║
  7101.        ╟──────────────────────────────────────────────────────────────────────╢
  7102.        ║Parameter:                                                            ║
  7103.        ║INTEGER          Neu zu setzender Videomodus:                         ║
  7104.        ║                      Modus   Auflösg   Sp/Z.   Farben                ║
  7105.        ║                  0   Text    320*350   40*25   16 grau               ║
  7106.        ║                  1   Text    320*350   40*25   16                    ║
  7107.        ║                  2   Text    640*350   80*25   16 grau               ║
  7108.        ║                  3   Text    640*350   80*25   16                    ║
  7109.        ║                  4   Grafik  320*200   40*25   4                     ║
  7110.        ║                  5   Grafik  320*200   40*25   4 grau                ║
  7111.        ║                  6   Grafik  640*200   80*25   bw                    ║
  7112.        ║                  7   Text    720*350   80*25   bw                    ║
  7113.        ║                 13   Grafik  320*200   40*25   16                    ║
  7114.        ║                 14   Grafik  640*200   80*25   16                    ║
  7115.        ║                 15   Grafik  640*350   80*25   bw                    ║
  7116.        ║                 16   Grafik  640*350   80*25   16                    ║
  7117.        ║                 17   Grafik  640*480   80*30   bw                    ║
  7118.        ║                 18   Grafik  640*480   80*30   16                    ║
  7119.        ║                 19   Grafik  320*200   40*25   256                   ║
  7120.        ║INTEGER          Return: Bisheriger Videomodus.                       ║
  7121.        ║INTEGER          Flag zum Löschen des Bildschirms:                    ║
  7122.        ║                  1:  Bildschirm soll gelöscht werden                 ║
  7123.        ║                  2:  Bildschirm soll nicht gelöscht werden           ║
  7124.        ║                 Return:                                              ║
  7125.        ║                  0:  Setzen des neuen Videomodus ist nicht möglich   ║
  7126.        ╟──────────────────────────────────────────────────────────────────────╢
  7127.        ║Beispiel:        J=1                                                  ║
  7128.        ║                 CALL VIDMOD (18,I,J)                                 ║
  7129.        ║                 Es wird überprüft, ob der VGA-Farbmodus gesetzt      ║
  7130.        ║                 werden kann. Wenn das der Fall ist, wird in I der    ║
  7131.        ║                 bisherige Videomodus zurückgegeben und der VGA-      ║
  7132.        ║                 Farbmodus wird gesetzt, wobei der Bildschirminhalt   ║
  7133.        ║                 gelöscht wird. Eine 0 in J zeigt an, daß das Setzen  ║
  7134.        ║                 eines neuen Videomodus aus Gründen der Hardware-     ║
  7135.        ║                 konfiguration nicht möglich ist.                     ║
  7136.        ╚══════════════════════════════════════════════════════════════════════╝
  7137.     
  7138.  
  7139.                                                                      Seite 183
  7140.  
  7141.  
  7142.        ASCII-Code-Tabelle
  7143.  
  7144.  
  7145.  
  7146.        CTL = Control-Code Steuerzeichen      Bed = Bedeutung Steuerzeichen
  7147.        Ch  = ASCII-Zeichen                   Dez = Dezimale Entsprechung
  7148.        Hex = Hexadezimale Entsprechung
  7149.  
  7150.  
  7151.  
  7152.  
  7153.        CTL.   Bed. Ch Dez. Hex.   Ch Dez. Hex.   Ch Dez. Hex.   Ch Dez. Hex.
  7154.  
  7155.        CTL @  NU        0  00     @   64  40     Ç  128  80     └  192  C0
  7156.        CTL A  SH        1  01     A   65  41     ü  129  81     ┴  193  C1
  7157.        CTL B  SX        2  02     B   66  42     é  130  82     ┬  194  C2
  7158.        CTL C  EX        3  03     C   67  43     â  131  83     ├  195  C3
  7159.        CTL D  ET        4  04     D   68  44     ä  132  84     ─  196  C4
  7160.        CTL E  EQ        5  05     E   69  45     à  133  85     ┼  197  C5
  7161.        CTL F  AK        6  06     F   70  46     å  134  86     ╞  198  C6
  7162.        CTL G  BEL       7  07     G   71  47     ç  135  87     ╟  199  C7
  7163.        CTL H  BS        8  08     H   72  48     ê  136  88     ╚  200  C8
  7164.        CTL I  HT        9  09     I   73  49     ë  137  89     ╔  201  C9
  7165.        CTL J  LF       10  0A     J   74  4A     è  138  8A     ╩  202  CA
  7166.        CTL K  VT       11  0B     K   75  4B     ï  139  8B     ╦  203  CB
  7167.        CTL L  FF       12  0C     L   76  4C     î  140  8C     ╠  204  CC
  7168.        CTL M  CR       13  0D     M   77  4D     ì  141  8D     ═  205  CD
  7169.        CTL N  SO       14  0E     N   78  4E     Ä  142  8E     ╬  206  CE
  7170.        CTL O  SI       15  0F     O   79  4F     Å  143  8F     ╧  207  CF
  7171.        CTL P  DL       16  10     P   80  50     É  144  90     ╨  208  D0
  7172.        CTL Q  D1       17  11     Q   81  51     æ  145  91     ╤  209  D1
  7173.        CTL R  D2       18  12     R   82  52     Æ  146  92     ╥  210  D2
  7174.        CTL S  D3       19  13     S   83  53     ô  147  93     ╙  211  D3
  7175.        CTL T  D4       20  14     T   84  54     ö  148  94     ╘  212  D4
  7176.        CTL U  NK       21  15     U   85  55     ò  149  95     ╒  213  D5
  7177.        CTL V  SY       22  16     V   86  56     û  150  96     ╓  214  D6
  7178.        CTL W  EB       23  17     W   87  57     ù  151  97     ╫  215  D7
  7179.        CTL X  CN       24  18     X   88  58     ÿ  152  98     ╪  216  D8
  7180.        CTL Y  EM       25  19     Y   89  59     Ö  153  99     ┘  217  D9
  7181.        CTL Z  SB       26  1A     Z   90  5A     Ü  154  9A     ┌  218  DA
  7182.        CTL [  EC       27  1B     [   91  5B     ¢  155  9B     █  219  DB
  7183.        CTL \  FS       28  1C     \   92  5C     £  156  9C     ▄  220  DC
  7184.        CTL ]  GS       29  1D     ]   93  5D     ¥  157  9D     ▌  221  DD
  7185.        CTL ^  RS       30  1E     ^   94  5E     ₧  158  9E     ▐  222  DE
  7186.        CTL _  US       31  1F     _   95  5F     ƒ  159  9F     ▀  223  DF
  7187.                        32  20     `   96  60     á  160  A0     α  224  E0
  7188.                    !   33  21     a   97  61     í  161  A1     ß  225  E1
  7189.                    "   34  22     b   98  62     ó  162  A2     Γ  226  E2
  7190.                    #   35  23     c   99  63     ú  163  A3     π  227  E3
  7191.                    $   36  24     d  100  64     ñ  164  A4     Σ  228  E4
  7192.                    %   37  25     e  101  65     Ñ  165  A5     σ  229  E5
  7193.                    &   38  26     f  102  66     ª  166  A6     µ  230  E6
  7194.                    '   39  27     g  103  67     º  167  A7     τ  231  E7
  7195.                    (   40  28     h  104  68     ¿  168  A8     Φ  232  E8
  7196.                    )   41  29     i  105  69     ⌐  169  A9     Θ  233  E9
  7197.     
  7198.  
  7199.                                                                      Seite 184
  7200.  
  7201.  
  7202.                    *   42  2A     j  106  6A     ¬  170  AA     Ω  234  EA
  7203.                    +   43  2B     k  107  6B     ½  171  AB     δ  235  EB
  7204.                    ,   44  2C     l  108  6C     ¼  172  AC     ∞  236  EC
  7205.                    -   45  2D     m  109  6D     ¡  173  AD     φ  237  ED
  7206.                    .   46  2E     n  110  6E     «  174  AE     ε  238  EE
  7207.                    /   47  2F     o  111  6F     »  175  AF     ∩  239  EF
  7208.                    0   48  30     p  112  70     ░  176  B0     ≡  240  F0
  7209.                    1   49  31     q  113  71     ▒  177  B1     ±  241  F1
  7210.                    2   50  32     r  114  72     ▓  178  B2     ≥  242  F2
  7211.                    3   51  33     s  115  73     │  179  B3     ≤  243  F3
  7212.                    4   52  34     t  116  74     ┤  180  B4     ⌠  244  F4
  7213.                    5   53  35     u  117  75     ╡  181  B5     ⌡  245  F5
  7214.                    6   54  36     v  118  76     ╢  182  B6     ÷  246  F6
  7215.                    7   55  37     w  119  77     ╖  183  B7     ≈  247  F7
  7216.                    8   56  38     x  120  78     ╕  184  B8     °  248  F8
  7217.                    9   57  39     y  121  79     ╣  185  B9     ∙  249  F9
  7218.                    :   58  3A     z  122  7A     ║  186  BA     ·  250  FA
  7219.                    ;   59  3B     {  123  7B     ╗  187  BB     √  251  FB
  7220.                    <   60  3C     |  124  7C     ╝  188  BC     ⁿ  252  FC
  7221.                    =   61  3D     }  125  7D     ╜  189  BD     ²  253  FD
  7222.                    >   62  3E     ~  126  7E     ╛  190  BE     ■  254  FE
  7223.                    ?   63  3F       127  7F     ┐  191  BF        255  FF
  7224.     
  7225.  
  7226.                                                                      Seite 185
  7227.  
  7228.  
  7229.        Farbcode-Tabelle
  7230.  
  7231.  
  7232.  
  7233.  
  7234.        Dez = Dezimaler Farbcode für Farbattribut
  7235.        Hex = Hexadezimaler Farbcode für Farbattribut
  7236.  
  7237.  
  7238.  
  7239.  
  7240.        Vordergrund Hintergrund Dez Hex     Vordergrund Hintergrund Dez Hex
  7241.  
  7242.        Schwarz     Schwarz       0  00     Schwarz     Rot          64  40
  7243.        Blau        Schwarz       1  01     Blau        Rot          65  41
  7244.        Grün        Schwarz       2  02     Grün        Rot          66  42
  7245.        Cyan        Schwarz       3  03     Cyan        Rot          67  43
  7246.        Rot         Schwarz       4  04     Rot         Rot          68  44
  7247.        Magenta     Schwarz       5  05     Magenta     Rot          69  45
  7248.        Braun       Schwarz       6  06     Braun       Rot          70  46
  7249.        Hellgrau    Schwarz       7  07     Hellgrau    Rot          71  47
  7250.        Dunkelgrau  Schwarz       8  08     Dunkelgrau  Rot          72  48
  7251.        Hellblau    Schwarz       9  09     Hellblau    Rot          73  49
  7252.        Hellgrün    Schwarz      10  0A     Hellgrün    Rot          74  4A
  7253.        Hellcyan    Schwarz      11  0B     Hellcyan    Rot          75  4B
  7254.        Hellrot     Schwarz      12  0C     Hellrot     Rot          76  4C
  7255.        Hellmagenta Schwarz      13  0D     Hellmagenta Rot          77  4D
  7256.        Gelb        Schwarz      14  0E     Gelb        Rot          78  4E
  7257.        Weiß        Schwarz      15  0F     Weiß        Rot          79  4F
  7258.        Schwarz     Blau         16  10     Schwarz     Magenta      80  50
  7259.        Blau        Blau         17  11     Blau        Magenta      81  51
  7260.        Grün        Blau         18  12     Grün        Magenta      82  52
  7261.        Cyan        Blau         19  13     Cyan        Magenta      83  53
  7262.        Rot         Blau         20  14     Rot         Magenta      84  54
  7263.        Magenta     Blau         21  15     Magenta     Magenta      85  55
  7264.        Braun       Blau         22  16     Braun       Magenta      86  56
  7265.        Hellgrau    Blau         23  17     Hellgrau    Magenta      87  57
  7266.        Dunkelgrau  Blau         24  18     Dunkelgrau  Magenta      88  58
  7267.        Hellblau    Blau         25  19     Hellblau    Magenta      89  59
  7268.        Hellgrün    Blau         26  1A     Hellgrün    Magenta      90  5A
  7269.        Hellcyan    Blau         27  1B     Hellcyan    Magenta      91  5B
  7270.        Hellrot     Blau         28  1C     Hellrot     Magenta      92  5C
  7271.        Hellmagenta Blau         29  1D     Hellmagenta Magenta      93  5D
  7272.        Gelb        Blau         30  1E     Gelb        Magenta      94  5E
  7273.        Weiß        Blau         31  1F     Weiß        Magenta      95  5F
  7274.        Schwarz     Grün         32  20     Schwarz     Braun        96  60
  7275.        Blau        Grün         33  21     Blau        Braun        97  61
  7276.        Grün        Grün         34  22     Grün        Braun        98  62
  7277.        Cyan        Grün         35  23     Cyan        Braun        99  63
  7278.        Rot         Grün         36  24     Rot         Braun       100  64
  7279.        Magenta     Grün         37  25     Magenta     Braun       101  65
  7280.        Braun       Grün         38  26     Braun       Braun       102  66
  7281.        Hellgrau    Grün         39  27     Hellgrau    Braun       103  67
  7282.        Dunkelgrau  Grün         40  28     Dunkelgrau  Braun       104  68
  7283.        Hellblau    Grün         41  29     Hellblau    Braun       105  69
  7284.     
  7285.  
  7286.                                                                      Seite 186
  7287.  
  7288.  
  7289.        Hellgrün    Grün         42  2A     Hellgrün    Braun       106  6A
  7290.        Hellcyan    Grün         43  2B     Hellcyan    Braun       107  6B
  7291.        Hellrot     Grün         44  2C     Hellrot     Braun       108  6C
  7292.        Hellmagenta Grün         45  2D     Hellmagenta Braun       109  6D
  7293.        Gelb        Grün         46  2E     Gelb        Braun       110  6E
  7294.        Weiß        Grün         47  2F     Weiß        Braun       111  6F
  7295.        Schwarz     Cyan         48  30     Schwarz     Hellgrau    112  70
  7296.        Blau        Cyan         49  31     Blau        Hellgrau    113  71
  7297.        Grün        Cyan         50  32     Grün        Hellgrau    114  72
  7298.        Cyan        Cyan         51  33     Cyan        Hellgrau    115  73
  7299.        Rot         Cyan         52  34     Rot         Hellgrau    116  74
  7300.        Magenta     Cyan         53  35     Magenta     Hellgrau    117  75
  7301.        Braun       Cyan         54  36     Braun       Hellgrau    118  76
  7302.        Hellgrau    Cyan         55  37     Hellgrau    Hellgrau    119  77
  7303.        Dunkelgrau  Cyan         56  38     Dunkelgrau  Hellgrau    120  78
  7304.        Hellblau    Cyan         57  39     Hellblau    Hellgrau    121  79
  7305.        Hellgrün    Cyan         58  3A     Hellgrün    Hellgrau    122  7A
  7306.        Hellcyan    Cyan         59  3B     Hellcyan    Hellgrau    123  7B
  7307.        Hellrot     Cyan         60  3C     Hellrot     Hellgrau    124  7C
  7308.        Hellmagenta Cyan         61  3D     Hellmagenta Hellgrau    125  7D
  7309.        Gelb        Cyan         62  3E     Gelb        Hellgrau    126  7E
  7310.        Weiß        Cyan         63  3F     Weiß        Hellgrau    127  7F
  7311.     
  7312.